只出现一次的数 II

2019-06-09  本文已影响0人  SunspotsInys

源码如下

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        
        const int W = sizeof(int) * 8; //
        int count[W];
        fill_n(&count[0], W, 0);
        for (int i = 0; i < nums.size(); i++) {
            for (int j = 0; j < W; j++) {
                count[j] += (nums[i] >> j) & 1;
                count[j] %= 3;
            }
        }
        int result = 0;
        for (int i = 0; i < W; i++) {
            result += (count[i] << i);
        }
        return result;
        
    }
};

创建一个数组,第i位表示在i位出现1的次数, 如果第i位是3的倍数则忽略,否则把该位取出组成答案。
在题解里面提供了用二进制模拟三进制的方法,看不懂,实现不了。不过找到,附在下面,说不定那天就看懂了。

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int one = 0, two = 0, three = 0;
        for (auto i : nums) {
            two |= (one & i);
            one ^= i;
            three = ~(one & two);
            one &= three;
            two &= three;
        }
        return one;
    }
};
上一篇 下一篇

猜你喜欢

热点阅读