题目:
给你一个整数数组 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
中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次
解题思路
我们用32位2进制表示nums中整形元素,发现一个规律:
-
只出现一次的数字在某位为1,该位1的总数和只可能为1,4,7…3n+1。
-
(32位中某一位1的总数和)%3!=0,就证明只出现一次的数字在该位为1。
-
只出现一次的数字在某位为0,该位1的总数和只可能为0,3,6…3n。
-
(32位中某一位1的总数和)%3==0,就证明只出现一次的数字在该位为0。
我们只需要遍历32位比特位,判断该位只出现一次的数字在该位为0还是1,然后新组合出来只出现一次的数字。
- 如果为0,该位操作没有继续下一位。
- 如果为1,就需要将该位的1加在(新组合出来的只出现一次的数字)上。
当32位都加上了相应的1,此时(新组合出来的只出现一次的数字)就是原数组中只出现一次的数字。
AC代码
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ret = 0;
for (int i = 0; i < 32; i++)
{
int count = 0;
for (auto e : nums)
{
count += (e >> i) & 1;
}
if (count % 3 ==1)
{
ret |= 1 << i;
}
}
return ret;
}
};