137. Single Number II

 

 

 

 

 

解法一:

map (哈希表)

时间复杂度: O(n)

空间复杂度:O(n)

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int n = nums.size();
        map<int, int> mp;
        mp.clear();
        for(int i = 0; i < n; i++) mp[nums[i]]++;
        int ans = 0;
        for(auto u : mp) {
            if(u.second == 1) {
                ans = u.first;
                break;
            }
        }
        return ans;
    }
};
View Code

 

解法二:

二进制位

记要找的那个数(即出现一次的数)为 ans,

由于数组中的元素都 int ( 32位整数 )范围内,因此我们可以依次计算答案的每一个二进制位是 0 还是 1。

如果当前数 x 不是 ans ,则必然出现了3次,那么它的第 i 位二进制位,必然出现了 0 或 3 次。

则 ans 的第 i 位二进制位就是所有元素第 i 个二进制位之和 余 3 的结果。

 

具体做法:

对于数组中的每一个元素 x , 使用位运算 (x >> i)& 1 得到 x 的第 i 个二进制位, 将它们相加再对 3 取余,得到的结果 不是  0 就是 1, 这个结果就是 ans 的第 i 个二进制位。

把 ans 的每一位组合成 ans :     ans |= ( 1 <<  i ) ;

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ans = 0;
        for (int i = 0; i < 32; ++i) {
            int total = 0;
            for (int num: nums) {
                total += ((num >> i) & 1);
            }
            if (total % 3) {
                ans |= (1 << i);
            }
        }
        return ans;
    }
};
View Code

注: 如果使用的语言对「有符号整数类型」和「无符号整数类型」没有区分,那么可能会得到错误的答案。

复杂度分析

时间复杂度:O(nlogC),其中 n 是数组的长度,C 是元素的数据范围

空间复杂度:O(1)。

 

解法三:

数字电路设计

解法四:

数字电路设计优化

posted on 2021-04-30 09:49  hannah_id  阅读(83)  评论(0)    收藏  举报

导航