LeetCode 137. 只出现一次的数字 II

89 阅读1分钟

LeetCode 137. 只出现一次的数字 II

给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法且不使用额外空间来解决此问题。

 

示例 1:

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

输入:nums = [0,1,0,1,0,1,99] 输出:99  

提示:

  • 1 <= nums.length <= 3 * 104
  • -2^31 <= nums[i] <= 2^31 - 1
  • nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次

算法

(位运算) O(nlogs)

根据 Single Number 的做法,可以推广到更一般的问题。
考虑二进制每一位上出现 0 和 1 的次数,如果出现 1 的次数为 3k + 1,则证明答案中这一位是 1。

时间复杂度

遍历 O(logs) 次数组,故时间复杂度为 O(nlogs),其中 s 是最大可能的数字范围。

空间复杂度

仅需要常数的额外空间。

C++ 代码

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ans = 0;

        for (int bit = 0; bit < 32; bit++) {
            int c = 0;

            for (int x : nums)
                c += (x >> bit) & 1;

            ans |= (c % 3) << bit;
        }

        return ans;
    }
};