56-II. 数组中数字出现的次数 II

1. 描述

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

2. 例子

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

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

3. 限制

  • 1 <= nums.length <= 10000
  • 1 <= nums[i] < $2^{31}$

4. 题解

n = m_nums.size()
时间复杂度: O(n)
空间复杂度: O(1)

我们统计每个二进制数字中 1 左移 0 ~ 31 位的个数,然后除结果外,每个数字都出现三次,所以他们的任意二进制位都出现三次。所以将他们的二进制位出现次数对三取余,有余数的就是那个唯一出现一次的数字含有的二进制位。
只要改变取余的数字,就可以求得其他数字出现任何次时仅有一个数字出现一次的题。
为了性能,应当把 map 换成低级数据结构数组。

class Solution 
{
public:
    // int singleNumber(vector<int>& nums) 
    int singleNumber(vector<int> &i_nums) 
    {
        unordered_map<int, int> leftMoveDigitsCount;
        for(int i = 0; i < i_nums.size(); i++)
        {
            for(int j = 0; j < 32 && (1 << j) <= i_nums[i]; j++)
            {
                if((1 << j) & i_nums[i])
                    leftMoveDigitsCount[j]++;
            }
        }

        int uniqueNumber = 0;
        for(int i = 0; i < 32; i++)
        {
            if(leftMoveDigitsCount[i] % 3)
                uniqueNumber += (1 << i);
        }

        return uniqueNumber;
    }
};
Last updated:
Tags:
comments powered by Disqus