剑指 Offer 56 - II. 数组中数字出现的次数 II
题目
在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字
思路
将数组中所有的数字的二进制表示的每一位都加起来,如果某一位的和能被3正处,那么那个只出现一次的数字二进制表示中对应的那一位就是0否则就是1。
代码
class Solution {
public:
int singleNumber(vector<int>& nums) {
int bits[32] = {0};
for(int i = 0; i < nums.size(); i++)
{
int j = 0;
while(nums[i])
{
// 得到各个二进制位为1的有多少个
bits[j] += nums[i] % 2;
nums[i] /= 2;
j++;
}
}
int ans = 0;
for(int i = 0; i < 32; i++)
{
// 利用%3 来秋的对应位置上有没有1 有的话乘以对应的2的i次方
ans += (1 << i) * (bits[i] % 3);
}
return ans;
}
};