AcWing 74. 数组中唯一只出现一次的数字

题目描述

在一个数组中除了一个数字只出现一次之外,其他数字都出现了三次。

请找出那个只出现一次的数字。

你可以假设满足条件的数字一定存在。

思考题:

  • 如果要求只使用 O(n) 的时间和额外 O(1) 的空间,该怎么做呢?

样例

输入:[1,1,1,2,2,2,3,4,4,4]

输出:3

问题分析 

先将数组中的所有元素的最后一位加起来,然后对3求余,如果为0说明答案的最后一位是0;如果为1说明答案的最后一位是1。然后将数组中的所有元素的倒数第二位加起来,然后对3求余,如果为0说明答案的倒数第二位是0;如果为1说明答案的倒数第二位是1。以此类推,一直算出答案的32位都是什么,最后返回答案ans。

代码实现

class Solution {
public:
    int findNumberAppearingOnce(vector<int>& nums) {
        int ans = 0;
        for(int i = 0; i < 32; i++){
            int sum = 0;
            for(int j : nums){
                sum += (j >> i) & 1; 
            }
            ans |= ((sum % 3) << i);
        }
        return ans;
    }
};


 

猜你喜欢

转载自blog.csdn.net/mengyujia1234/article/details/90108985