位运算
- 将每一个具体的 位 进行试探
- 从最高的一位开始,到最高的两位,到前三位
- 每次都将 nums 的前几位计入 map 中
- 这样只需要将 map 中的每一个元素 与 我们假设存在的 xNext 异或运算之后的答案再在 map 找看看是否存在即可
- 如果存在,x 继承 xNext,不存在,则说明我们的假设当前位为 1 不对,继承 xNext - 1 即可
func findMaximumXOR(nums []int) (x int) {
const highBit = 30 // 最高位的二进制位编号为 30
for k := highBit; k >= 0; k-- {
// 将所有的 pre^k(a_j) 放入哈希表中
seen := map[int]bool{}
for _, num := range nums {
// 如果只想保留从最高位开始到第 k 个二进制位为止的部分
// 只需将其右移 k 位
seen[num>>k] = true
}
// 目前 x 包含从最高位开始到第 k+1 个二进制位为止的部分
// 我们将 x 的第 k 个二进制位置为 1,即为 x = x*2+1
xNext := x*2 + 1
found := false
// 枚举 i
for _, num := range nums {
if seen[num>>k^xNext] {
found = true
break
}
}
// 下面这种就是我所写的题解步骤中对应的步骤 4 ,当然效果跟上面代码一样
// for num := range seen {
// if seen[num^xNext] {
// found = true
// break
// }
// }
if found {
x = xNext
} else {
// 如果没有找到满足等式的 a_i 和 a_j,那么 x 的第 k 个二进制位只能为 0
// 即为 x = x*2
x = xNext - 1
}
}
return
}