找出数组中只出现一次的俩个元素
package com.sly.uploadfile.algorithm.pack1;
/**
* Created by fmgao on 2019/9/26.
* 给定一个整数数组nums,其中恰好有俩个元素只出现一次,其余所有元素均出现俩次,找出只出现一次的俩个元素
*/
public class FindTwoFromNums {
public static void main(String[] args) {
int[] s = {1, 2, 1, 3, 2, 5};
int[] two = getTwo(s);
for (int b : two) {
System.out.printf("," + b);
}
}
public static int[] getTwo(int[] nums) {
int c1 = 0;
for (int num : nums) {
c1 ^= num;
}
int i = 1;
while ((c1 & i) == 0) {
i <<= 1;
}
int c2 = 0, c3 = 0;
for (int num : nums) {
if ((c2 & i) == 0) {
c2 ^= num;
} else {
c3 ^= num;
}
}
return new int[]{c2, c3};
}
}
通配符匹配
package com.sly.uploadfile.algorithm.pack1;
/**
* Created by fmgao on 2019/9/12.
*
* 示例:
* 输入:
s = "aa"
p = "a"
输出: false
解释: "a" 无法匹配 "aa" 整个字符串。
*
*/
public class TongPeiFuPiPei {
public static void main(String[] args) {
boolean res = getTongPei("cb", "?b");
System.out.println(res);
}
public static boolean getTongPei(String s, String p) {
// 申请dp[][]表格,dp[i][j]表示 若s(0,i-1)与p(0,j-1)匹配,dp[i][j]=true,否则为false
boolean[][] dp = new boolean[s.length() + 1][p.length() + 1];
// s与p都为空时,匹配
dp[0][0] = true;
// s为空,p中含有'*'时
for (int j = 1; j < (p.length() + 1); j++) {
if (p.charAt(j - 1) == '*'){
dp[0][j] = dp[0][j - 1] && true;
}
}
for (int i = 1; i < (s.length() + 1); i++) {
for (int j = 1; j < (p.length() + 1); j++) {
if ((p.charAt(j - 1) == s.charAt(i - 1)) || (p.charAt(j - 1) == '?')) {
dp[i][j] = dp[i - 1][j - 1];
}
if (p.charAt(j - 1) == '*') {
dp[i][j] = dp[i][j - 1] || dp[i - 1][j] || dp[i - 1][j - 1];
}
}
}
return dp[s.length()][p.length()];
}
}
合并俩个数组,得到一个新的有序数组
package com.sly.uploadfile.algorithm.pack1;
/**
* Created by fmgao on 2019/9/17.
* 合并俩个有序数组,得到一个新的有序数组
*/
public class TowNums {
public static void main(String[] args) {
int[] a = {1, 5, 9, 14, 15};
int[] b = {0, 3, 7, 13, 18};
int[] c = arrayMerge(a, b);
for (int d : c) {
System.out.print(d + ",");
}
}
public static int[] arrayMerge(int[] arr1, int[] arr2) {
int len1 = arr1.length;
int len2 = arr2.length;
int[] result = new int[len1 + len2];
int l1 = 0, l2 = 0, l3 = 0;
while (l1 < len1 && l2 < len2) {
if (arr1[l1] < arr2[l2]) {
result[l3++] = arr1[l1++];
} else {
result[l3++] = arr2[l2++];
}
}
while (l1 < len1) {
result[l3++] = arr1[l1++];
}
while (l2 < len2) {
result[l3++] = arr2[l2++];
}
return result;
}
}
快速排序
package com.sly.uploadfile.algorithm.sortdemo01;
/**
* Created by fmgao on 2019/9/13.
*/
public class QuickSort {
public static void main(String[] args) {
int ars[] = {9, 8, 66, 1, 3, 90, 0, 33, 0};
quickSort(ars);
for (int s : ars) {
System.out.print(s + " ");
}
}
private static void quickSort(int[] array) {
if (array != null) {
quickSort(array, 0, array.length - 1);
}
}
private static void quickSort(int[] array, int beg, int end) {
if (beg > end || array == null) {
return;
}
int p = partition(array, beg, end);
quickSort(array, beg, p - 1);
quickSort(array, p + 1, end);
}
private static int partition(int[] array, int beg, int end) {
int first = array[beg];
int i = beg, j = end;
while (i < j) {
while (array[i] <= first && i < end) {
i++;
}
while (array[j] > first && j >= beg) {
j--;
}
if (i < j) {
array[i] = array[i] ^ array[j];
array[j] = array[i] ^ array[j];
array[i] = array[i] ^ array[j];
}
}
if (j != beg) {
array[j] = array[beg] ^ array[j];
array[beg] = array[beg] ^ array[j];
array[j] = array[beg] ^ array[j];
}
// System.out.println("j:" + j);
return j;
}
}
单节点链表
package com.sly.uploadfile.algorithm.twoadd;
/**
* Created by fmgao on 2019/11/13.
*/
public class ListNode {
int data;
ListNode next;
ListNode(int data) {
this.data = data;
}
}
package com.sly.uploadfile.algorithm.twoadd;
/**
* Created by fmgao on 2019/11/13.
*/
public class SingleLinkedList {
public int size;
public ListNode head;
// head|next ->null
public SingleLinkedList() {
size = 0;
head = null;
}
// head -> a|next ->b|next ->null
public void addData(int obj) {
ListNode node = new ListNode(obj);
if (size == 0) {
head = node;
node.data = obj;
} else {
node.next = head;
head = node;
node.data = obj;
}
size++;
}
// head -> a|next ->b|next ->c|next ->null
public boolean deleteData(int value) {
if (size == 0) {
return false;
}
ListNode current = head;
ListNode previous = head;
while (current.data != value) {
if (current.next == null) {
return false;
} else {
previous = current;
current = current.next;
}
}
if (current == head) {
head = current.next;
size--;
} else {
previous.next = current.next;
size--;
}
return true;
}
public void display() {
ListNode node = head;
while (node != null) {
if (node.next == null) {
System.out.print(node.data);
node = node.next;
} else {
System.out.print(node.data + "->");
node = node.next;
}
}
}
public static void main(String[] args) {
SingleLinkedList list = new SingleLinkedList();
list.addData(1);
list.addData(2);
list.addData(5);
list.deleteData(5);
list.addData(5);
list.display();
}
}