【leetcode】137. 只出现一次的数字 II

46 阅读1分钟

leetcode-137.png

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),满足题目的高级要求。