题目
剑指 Offer 56 - II. 数组中数字出现的次数 II - 力扣(LeetCode)
题目描述:
在一个数组 n u m s nums nums中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。
示例 1:
输入:nums = [3,4,3,3]
输出:4
示例 2:
输入:nums = [9,1,7,9,7,9,7]
输出:1
限制:
1 <= nums.length <= 10000
1 <= nums[i] < 2^31
解题思路
预备知识:
在上面的几题中,使用了异或的性质,其实本质上还是数的二进制存储以及位运算。
这题中由于数字出现了三次,异或很难消除。
换一种思路,每个数都是由
32
32
32位二进制位组成的。
如果我们统计每个二进制位出现的个数,相同数字的二进制位出现的个数一定是三的倍数。
由此,只要求出
32
32
32位二进制出现的个数就能解决问题。
根据这种思路,理论上能解决这种出现 k k k次的问题。
代码
class Solution {
public:
int singleNumber(vector<int>& nums) {
// 32位二进制
vector<int> Bit(32, 0);
for(auto t : nums){
int i = 0;
while(t){
if(t & 1){
++Bit[i]; // 相应的位加一
}
++i;
t >>= 1;
}
}
int ans = 0;
for(int i = 0; i < Bit.size(); ++i){
if(Bit[i]%3 == 1){
ans |= (1 << i); // 相应的位置位
}
}
return ans;
}
};