找出数组中唯一出现一次的数字,其他数字都恰好出现两次
js
function uniqueNumber(nums) {
return nums.reduce((a, b) => a ^ b);
}
console.log(uniqueNumber([1, 3, 1, 2, 2, 7, 3, 6, 7]));
代码解析:
- 函数功能:
uniqueNumber
函数接收一个数组nums
,使用reduce
方法结合按位异或 (^
) 操作,找出数组中唯一不重复的数字。 - 异或运算的特性:
- 任何数和 0 异或,结果仍然是它本身:
a ^ 0 = a
。 - 任何数和 自身 异或,结果是 0:
a ^ a = 0
。 - 异或运算满足交换律和结合律:
a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b
。
- 任何数和 0 异或,结果仍然是它本身:
- 执行过程:
- 遍历数组,对所有数字依次进行异或运算。
- 成对出现的数字异或后会互相抵消(变成 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),只需遍历一次数组,效率非常高。