思路:异或,我们可以把所有数字分成两组,使得:
1.两个只出现一次的数字在不同的组中;
2.相同的数字会被分到相同的组中。
class Solution {
public int[] singleNumbers(int[] nums) {
int sum = 0;
// 将所有数字异或
for (int num : nums) {
sum ^= num;
}
// 找到二进制中第一位是1的数
int mask = 1;
while ((mask & sum) == 0){
mask <<= 1;
}
int a =0, b = 0;
for (int num : nums) {
// 分组
if ((num & mask) == 0){
a ^= num;
}else {
b ^= num;
}
}
return new int[]{a, b};
}
}