Leetcode 260. 只出现一次的数字 (位运算)

Leetcode 260. 只出现一次的数字 (位运算)_第1张图片

 

只有一个元素只出现,其余都出现两次,那么一次位运算就能解决。

如果有两个数只出现一次,其余两个数都只出现一次,一次位运算得到的是a^b,那么如何分开这两个数?

这个思路比较有跳跃性,a和b不同,所以a和b至少有一位不同,不妨取一个最低位k,一个必为0,另外一个必为1,然后将剩下的数按照位为1和位0分为两组,就等价于两个前面的问题。

这个思路跳跃性比较强。不容易想到。

class Solution {
public:
    int find(vector& nums, int k, int x){
        int res = 0;
        for(auto num:nums){
            if(((num>>k)&1)==x) res^=num;
        }
        return res;
    }

    vector singleNumber(vector& nums) {
        int ab = 0;
        for(auto num:nums) ab^=num;
        int k = 0;
        while((ab>>k&1)==0) k++;
        cout<

 

 

 

你可能感兴趣的:(算法)