leetcode刷题系列C++-single number II

Given an array of integers, every element appears three times except for one. Find that single one.

Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

Subscribe to see which companies asked this question

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int n = nums.size();
        int res = 0;
        int bitnum[32] = {0};
        for(int i = 0; i < 32; ++i)
        {
            for(int j = 0; j < n; ++j)
            {
                bitnum[i] += (nums[j] >> i) & 1;
            }
            res |= (bitnum[i]%3) << i;
        }
        return res;
    }
};

解题说明:

1.通过移位运算 和 1进行与运算可以提取出各个每个位上的数字, 将每个位上的数字相加,因为如果出现三个相同的数字时,在模3的时候 该数字会直接略去,剩下的就是那个模三有剩余的 

2.然后将所有的这些位反向拼接起来即可  拼接主要是通过右移运算,然后或运算(加法) 组合起来。 该题是位运算的典型代表

你可能感兴趣的:(leetcode刷题系列C++-single number II)