剑指 Offer 56 - I.数组中数字出现的次数
分组异或! 细节都写在注释里了
时间复杂度O(N)
空间复杂度O(1)
class Solution {
public int[] singleNumbers(int[] nums) {
int xor = 0;
for(int num : nums) xor ^= num; //获取两个数中不一样的位
int mask = 1;
while((xor & mask) == 0) { //获取两个数中从右往左第一个不一样的位
mask <<= 1;
}
int a, b;
a = b = 0;
for(int num : nums) {
if((num & mask) == 0) a ^= num; //将两个数分组,其他值相同的一定会在用一组,相同的值也抵消为0
else b ^= num;
}
return new int[]{a,b};
}
}