只出现一次的数字 II

题目

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

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

示例 1:

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

示例 2:

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

提示:

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

思路

因为除某个元素仅出现一次,其余每个数都恰好出现三次,出现三次的数,

其二进制表示的每一位也出现三次,所有数的二进制表示的第i位的数量

除以3的余数就是出现一次元素的第i位数字。本题是只出现一次的数字

升级版,本题的方法其实也适合只出现一次的数字,是一个更通用的方法。

其他数字出现2次、3次、4次、...。都可以使用本题方法解决

代码

class Solution {

public:
    int singleNumber(vector<int>& nums) {
        int ans = 0;
        //遍历每一位
        for(int i = 0;i < 32;i++) {
            int totalOne = 0;
            //遍历每一个数的第i位,并计数
            for(int num: nums) {
                totalOne += (num >> i) & 1;
            }
            //如果有余数,说明第i位有1
            if(totalOne % 3) {
                ans |= 1 << i;
            }
        }
        return ans;
    }
};