136. 只出现一次的数字
这道题考察的是异或算法,也是异或算法的一个典型作用例子。
注意题目要求实现线性时间复杂度算法解决,所以就不要想着排序或者用set数组之类的了。
先讲讲异或算法。
异或(XOR)是一种常用的位运算操作,通常用于加密、校验和其它计算任务中。异或操作符在JavaScript等编程语言中的表示为`^`。对于两个操作数的每一对对应的比特位,只有当它们不同时结果才为1,否则结果为0。
异或运算的基本性质
- 交换律:A ^ B = B ^ A
- 结合律:A ^ (B ^ C) = (A ^ B) ^ C(可以将式子里的任意两个遍量优先异或!!!)
- 自反性:A ^ A = 0(!!!两个相同的数异或会等于0)
- 恒等性:A ^ 0 = A(一个数和本身异或值为本身!!!)
所以题目的做法一目了然
function findUnique(arr) {
let unique = 0;
for (let num of arr) {
unique ^= num;
}
return unique;
}
所有成对的数字通过异或运算会抵消为0,最后剩下的就是那个唯一的数。