没做出来,复写一下力扣的题解
首先通过对整个数组的一次异或遍历,我们可以得到一个由两个答案数字异或运算得到的数字 ret
通过 ret ,可以知道两个答案数字的哪一位是不同的,哪一位是相同的(1 的那一位就是不同的,0就是相同的)
如果 ret 的第 i 位 为 1,我们可以把整个数组分为两组,一组第 i 位为1,一组第 i 位为0。这样就可以把两个答案数组分在两组中,并且保证了数组中出现了两次的数字都在一组中。
最后分别对两个数组进行一次异或遍历,就可以得到答案
class Solution {
public int[] singleNumbers(int[] nums) {
int ret = 0;
for (int n : nums) {
ret ^= n;
}
int div = 1;
while ((div & ret) == 0) {
div <<= 1;
}
int a = 0, b = 0;
for (int n : nums) {
if ((div & n) != 0) {
a ^= n;
} else {
b ^= n;
}
}
return new int[]{a, b};
}
}