class Solution {
public int[] singleNumber(int[] nums) {
Set<Integer> set = new HashSet<>();
for (int num : nums) {
if (set.contains(num)) {
set.remove(num);
} else {
set.add(num);
}
}
int[] res = new int[2];
int index = 0;
for (Integer i : set) {
res[index++] = i;
}
return res;
}
}
异或
,得到的值为那两个不同元素的异或
结果异或
后结果为 1class Solution {
public int[] singleNumber(int[] nums) {
// 两个不同数的异或值
int tmp = 0;
for (int num : nums) {
tmp = tmp ^ num;
}
// 两个数不同,tmp 肯定不为 0,得到最后为 1 的位
// 4 -> 100
// -4 -> 11111111111111111111111111111100
// 4 & -4 -> 100
int fg = tmp & -tmp;
// 数组里面所有数的该位要么是 0,要么是 1,且与运算之后最终结果是 1
int res1 = 0;
int res2 = 0;
for (int num : nums) {
if ((num & fg) == 0) {
res1 = res1 ^ num;
} else {
res2 = res2 ^ num;
}
}
return new int[]{res1, res2};
}
}