异或操作特性
a^a = 0 // 任何数与自己异或都为0
a^0 = a // 任何数与0异或都是自己
a^b = b^a // 交换
a^b^c = a^(b^c) // 结合
算法题
假设一个数组,其中一类数出现奇数次,其他类数出现偶数次,求出出现奇数次的个数,
输入[1,1,1,2,2,3,3]
输出1
const array = [1,1,1,2,2,2,3,3]
let eor = 0
for (let i = 0; i < array.length; i++) {
eor^=array[i]
}
出现奇数次的数有两个
输入[1,1,1,2,2,2,3,3]
输出1,2
const array = [1,1,1,2,2,2,3,3]
let eor = 0
for (let i = 0; i < array.length; i++) {
eor^=array[i]
}
let onlyEor = 0
let rightOne = eor & (~eor + 1) // 找出最右侧的1
for (let i = 0; i < array.length; i++) {
if ((array[i]&rightOne) === 0) {
onlyEor ^= array[i]
}
}
eor = eor^onlyEor