思路, 先全部异或一次, 得到的结果, 考察其的某个非0位(比如最高非0位), 那么只出现一次的两个数中, 在这个位上一个为0, 一个为1, 由此可以将数组中的元素分成两部分,重新遍历, 求两个异或值。
代码:
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
int all=0;
for(auto i:nums)
all^=i;
int mask=1;
while((all&mask)==0){ //从右往左找出第一个为1的比特位对应的mask
mask<<=1;
}
int a=0;
int b=0;
for(auto i:nums)
if(i&mask)
a^=i;
else
b^=i;
return {a,b};
}
};