解法有两个
1.使用hash表
2.使用异或运算
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
/**
* @author xienl
* @description 数组中只出现一次的两个数字
* @date 2022/6/29
*/
public class Solution {
public static void main(String[] args) {
Solution solution = new Solution();
int[] nums = {1,4,1,6};
System.out.println(Arrays.toString(solution.FindNumsAppearOnce(nums)));
}
public int[] FindNumsAppearOnce (int[] array) {
// write code here
Map<Integer, Integer> map = new TreeMap<>();
for (int i = 0; i < array.length; i++){
map.put(array[i], map.getOrDefault(array[i], 0) + 1);
}
int[] ans = new int[2];
int index = 0;
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
if (entry.getValue() == 1){
ans[index++] = entry.getKey();
}
}
return ans;
}
/**
* 使用二进制求结果
* @param array
* @return
*/
private int[] binary(int[] array){
// 先异或运算求出和
int num = 0;
for (int i : array) {
num ^= i;
}
int mark = 1;
while ((num & mark) == 0){
mark <<= 1;
}
int a = 0;
int b = 0;
for (int i : array) {
if ((i & mark) == 0){
a ^= i;
} else {
b ^= i;
}
}
return a > b ? new int[]{b , a} : new int[]{a, b};
}
}