Skip to content

找出数组中唯一出现一次的数字,其他数字都恰好出现两次

js
function uniqueNumber(nums) {
    return nums.reduce((a, b) => a ^ b);
}


console.log(uniqueNumber([1, 3, 1, 2, 2, 7, 3, 6, 7]));

代码解析:

  1. 函数功能uniqueNumber 函数接收一个数组 nums,使用 reduce 方法结合按位异或 (^) 操作,找出数组中唯一不重复的数字。
  2. 异或运算的特性
    • 任何数和 0 异或,结果仍然是它本身:a ^ 0 = a
    • 任何数和 自身 异或,结果是 0a ^ a = 0
    • 异或运算满足交换律和结合律:a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b
  3. 执行过程
    • 遍历数组,对所有数字依次进行异或运算。
    • 成对出现的数字异或后会互相抵消(变成 0),最终剩下的就是唯一出现一次的数字。

示例:

js
console.log(uniqueNumber([1, 3, 1, 2, 2, 7, 3, 6, 7])); // 输出 6
  • 计算过程:
    1 ^ 3 ^ 1 ^ 2 ^ 2 ^ 7 ^ 3 ^ 6 ^ 7
    = (1 ^ 1) ^ (3 ^ 3) ^ (2 ^ 2) ^ (7 ^ 7) ^ 6
    = 0 ^ 0 ^ 0 ^ 0 ^ 6
    = 6

适用场景:

  • 该算法适用于 只有一个数字出现一次,其余数字均出现两次 的情况。
  • 如果数组中有多个数字只出现一次,或者某些数字出现奇数次(非两次),此方法不适用。

时间复杂度:

  • O(n),只需遍历一次数组,效率非常高。