题目
给定一个整数数组 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;
}
};
