数组中唯一只出现一次的数字(C++)/ 只出现一次的数字 II

题目:

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。

思路:

统计二进制中每一位的和,如果该位的和对3取余不为0,则表示这个只出现一次的数字该位为1

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        unsigned int len = nums.size();
        int *Bit_sum = new int[32];
        for(int i = 0; i < 32; i++)
            Bit_sum[i] = 0;
        for(unsigned int i = 0; i < len; i++)
        {
            long long Bit_val = 1;
            for(int j = 31; j >= 0; j--)
            {
                int bit = nums[i] & Bit_val; // 当前位为1,则该位计数加1
                if(bit != 0)
                    Bit_sum[j]++;
                Bit_val = (Bit_val * 2);
            }
        }
        long int result = 0;
        for(int i = 0; i < 32; i++)
        {
            result = result * 2;
            result += Bit_sum[i] % 3; // 对3 取余的结果即为单个的数字该位的结果
        }
        delete [] Bit_sum;
        return result;
    }
};