由于数组中的元素都在 [0, 2^31)的范围内,那么我们可以将每一个数表示为一个长度为 31位的二进制数,如果不满 31位,在最高位之前补上若干个前导0即可
这31个二进制位从低位到高位依次编号为 0, 1,⋯,30,我们从最高位第 30个二进制位开始,依次确定x的每一位是0还是1
由于我们需要找出最大的x,因此在枚举每一位时,我们先判断 xx 的这一位是否能取到1。如果能,我们取这一位为1,否则我们取这一位为0。
var findMaximumXOR = function(nums) {
const HIGH_BIT = 30;
let x = 0;
for (let k = HIGH_BIT; k >= 0; --k) {
const seen = new Set();
for (const num of nums) {
seen.add(num >> k);
}
const xNext = x * 2 + 1;
let found = false;
for (const num of nums) {
if (seen.has(xNext ^ (num >> k))) {
found = true;
break;
}
}
if (found) {
x = xNext;
} else {
x = xNext - 1;
}
}
return x;
};