2021年02月06日 周六 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】
1. 题目简介
剑指 Offer 56 - II. 数组中数字出现的次数 II
2. 题解
如果一个数字出现三次,那么它的二进制表示的每一位(0或者1)也出现三次。如果把所有出现三次的数字的二进制表示的每一位都分别加起来,那么每一位的和都能被3整除。
我们把数组中所有数字的二进制表示的每一位都加起来。如果某一位的和能被3整除,那么那个只出现一次的数字二进制表示中对应的那一位是0;否则就是1。
class Solution {
public:
int singleNumber(vector<int>& nums) {
vector<int> counts(32,0);
// 记录所有数字各二进制位的 1 出现次数之和
for(int num : nums) {
for(int j = 0; j < 32; j++) {
counts[j] += num & 1;
num >>= 1;
}
}
int res = 0, m = 3;
// 利用 左移操作 和 或运算 ,将 counts 数组中各二进位的值恢复到数字 res 上
for(int i = 0; i < 32; i++) {
res <<= 1;
res |= counts[31 - i] % m;
}
return res;
}
};
参考文献
《剑指offer 第二版》
https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-ii-lcof/solution/mian-shi-ti-56-ii-shu-zu-zhong-shu-zi-chu-xian-d-4/