给定一个数组,一个数字只出现1次,其余数字出现3次,要找到这个只出现1次的数字
由于做过之前的Single Number I,脑子里估计想着异或
第一种想法就是,考虑二进制,每一位统计一下出现了多少次1,然后对3取模
时间复杂度就是
O
(
32
n
)
=
O
(
n
)
O(32n)=O(n)
O(32n)=O(n)
第二种感觉有点魔法了
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ones = 0, twos = 0;
for(auto& c:nums){
ones ^= (c & (~twos));
twos ^= (c & (~ones));
}
return ones;
}
};
其中
ones ^= (c & (~twos))
可以写成
ones = (ones ^ c) & (~twos)
ones表示出现一次的
twos表示出现两次的
因此,先异或,表示出现奇数次,接着排除掉出现2次的