题目 给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。 所有数异或,得到两个相异的数 a a a和 b b b的异或值 a ⨁ b a\bigoplus b a⨁b,且 s = a ⨁ b ! = 0 s=a\bigoplus b!=0 s=a⨁b!=0,令 k = s ⋀ − s k=s\bigwedge-s k=s⋀−s,那么 k k k表示 s s s的最后一位1,该位上的1表示 a a a和 b b b在该位上不同,我们利用该特性将数组分分成两部分处理,即可得到结果。 代码
设s = xxx10..0
则-s = (!x)(!x)(!x)10..0
k = s&(-s) = 00010..0
class Solution {
public:
vector singleNumber(vector& nums) {
int s = 0;
for (int num : nums) { // 第一步
s ^= num;
}
int k = s & (-s); // 第二步 lowbit操作
vector ret(2);
for (int num : nums) { // 第三 第四步
if (num & k) {
ret[0] ^= num;
} else {
ret[1] ^= num;
}
}
return ret;
}
};