只有一个元素只出现,其余都出现两次,那么一次位运算就能解决。
如果有两个数只出现一次,其余两个数都只出现一次,一次位运算得到的是a^b,那么如何分开这两个数?
这个思路比较有跳跃性,a和b不同,所以a和b至少有一位不同,不妨取一个最低位k,一个必为0,另外一个必为1,然后将剩下的数按照位为1和位0分为两组,就等价于两个前面的问题。
这个思路跳跃性比较强。不容易想到。
class Solution {
public:
int find(vector<int>& nums, int k, int x){
int res = 0;
for(auto num:nums){
if(((num>>k)&1)==x) res^=num;
}
return res;
}
vector<int> singleNumber(vector<int>& nums) {
int ab = 0;
for(auto num:nums) ab^=num;
int k = 0;
while((ab>>k&1)==0) k++;
cout<<k<<endl;
return {find(nums,k,0),find(nums,k,1)};
}
};