136题是其他数字都存在偶数次(2次),然后找出存在一次的数字。这题是其他数字存在三次,找出存在一次的数字。
我们知道,所有整数在计算机中都用二进制表示(32 位),因此我们可以遍历每一位,对每一位上 1 出现的次数进行统计。
由于除了目标数字之外,其他数字都出现了 3 次,因此某一位上如果出现 1 的次数是 3 的倍数,那么这部分 1 肯定是由那些出现三次的数字提供的,可以被抵消。
而如果某一位上 1 出现的次数 不是 3 的倍数,就说明那个只出现一次的数字在这一位上为 1。
我们可以据此将该位设置为 1,逐位还原出那个只出现一次的数。
var singleNumber = function (nums) {
let res = 0;
for (let i = 0; i < 32; ++i) {
let bitCnt = 0;
for (let num of nums) {
// 轮训所有数字,出现在第i位的次数
bitCnt += (num >> i) & 1
}
// 不是3的整数倍,那么在第i位记录下来
if(bitCnt % 3 !== 0){
res |= 1 << i
}
}
return res
};
-
JavaScript 中数字是 64 位浮点数,但位运算会将其强制转换为 32 位有符号整数;
-
如果结果是负数,可能需要处理补码转换(视题目要求而定);
-
本算法时间复杂度为
O(n),空间复杂度为O(1),满足题目的高级要求。