剑指 Offer 56 - II. 数组中数字出现的次数 II
题目描述
在一个数组 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
解法:位运算
- 值得注意的是:如果某个数字出现3次,那么这个3个数字的和肯定能被3整除,则其对应二进制位的每一位的和也能被3整除
- 统计数组中每个数字的二进制中每一位的和,判断该和是否能被3整除。
- 若可以,则只出现一次的数字的二进制数中那一位为0,否则为1
类似“只有一个数字出现一次,其余数字都出现N次”的问题:
- N为偶数:异或
- N为计数:位运算求和整除
var singleNumber = function(nums) {
let res = 0;
for(let i = 0; i < 32; ++i){
let cnt = 0;
for(let n of nums){
if(n & (1 << i)){// n & 1 << i 的值大于0即为真
cnt++;
}
}
if(cnt % 3 == 1){ // 构造只出现一次的那个数字,采用异或的方法生成二进制中的每一位
res ^= (1 << i);
}
}
return res;
};