思路
异或运算符合交换律和结合律
class Solution {
public:
vector<int> singleNumbers(vector<int>& nums) {
// 1 求异或和,其结果也就是两个不同数的异或结果
int xorsum = 0;
for(auto num:nums){
xorsum ^= num;
}
// 2 建立mask (one-hot), 找到xorsum中最右边的1
// 也可以一步到位
// int mask = xorsum & (-xorsum);
int mask = 1;
while((xorsum & mask) == 0){
mask <<= 1; // 左移 低位补零
};
// 3 分组并求异
vector<int> res(2,0);
for(auto num:nums){
if (num & mask)
res[0] ^= num;
else
res[1] ^= num;
}
return res;
}
};