一、题目描述

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

示例 1:

输入:nums = [3,4,3,3]
输出:4
示例 2:

输入:nums = [9,1,7,9,7,9,7]
输出:1

限制:

1 <= nums.length <= 10000
1 <= nums[i] < 2^31

2.题目难度:中等

三、题解

方法一:使用HashMap计数

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        map<int,int> mp;
        int n = nums.size();
        for(int num:nums){
            mp[num]++;
        }
        for(auto it=mp.begin();it!=mp.end();it++){
            if(it->second == 1)
                return it->first;
        }
        return 0;
    }
};

方法二:

使用位运算

计算所有数每一位的和

然后对每一位mod 3,

最后剩余的数即为所求

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int bit[32] = {0};
        for(int num:nums){
            for(int i=31;i>=0;i--){
                bit[i] += (num & 1);
                num >>= 1;
            }
        }
        int res = 0;
        for(int i=0;i<32;i++){
            res <<= 1;
            res += bit[i] % 3;
            
        }
        return res;
    }
};

 

posted on 2021-03-10 22:05  曹婷婷  阅读(58)  评论(0编辑  收藏  举报