leetcode137 Single Number II

给定一个数组,一个数字只出现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次的

你可能感兴趣的:(数据结构与算法,算法,数据结构)