通过mask来判断最终结果在哪些bit上能取到1 核心公式a^b=c <---->a^c=b
以下是自己的理解
nums=[3, 10, 5, 25, 2, 8,26] 这里因为最大数才25所以bit直接从4开始
3 ‘00011’
10 ‘01010’
5 ‘00101’
25 ‘11001’
2 ‘00010’
8 ‘01000’
26 ‘11010’
- bit=4
mask=10000
prefixSet存的是mask与操作nums的结果mask为{0,16}
guess 猜测最终结果这个bit=4上是否为1
for prefix in prefixSet:
if prefix^guess in prefixSet:
res=guess
break
这个循环判断是关键当prefix=0时 prefix^guess=16(例如3与25的第四位的异或结果为16) 在 prefixSet中 res=guess(最终结果第四位上能取到1)
对照着上面的二进制是不是能找到两个异或后第4bit上为1 - bit=3
mask=11000
prefixSet={0,8,24}
guess=16|8=24
prefix=0时 prefix^guess=24 res=24
对照着上面的二进制是不是能找到两个异或后第4bit,3bit上为11 - bit=2
mask=11100
prefixSet={0,8,24}
guess=24|4=28
prefix=0时 prefix^guess=28
prefix=8时 prefix^guess=20
prefix=24时 prefix^guess=4 均不在prefixSet中
对照着上面的二进制是不是找不到两个数异或后第4bit,3bit,2bit上为111 所以只能为110 - bit=1
mask=11110
prefixSet={2,8,10,24,26}
guess=24|2=26
就是能取到第4bit,3bit,2bit,1bit上1101
经过循环判断后能取到 所以res=26 - bit=0
mask=11111
prefixSet={2,3,8,10,24,25,26}
guess=26|1=27
就是能取到第4bit,3bit,2bit,1bit,0bit上11011
经过循环判断后能取到 所以res=27
class Solution:
def findMaximumXOR(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
mask=0
res=0
for bit in range(31,-1,-1):
mask |= 1<<bit
prefixSet={num&mask for num in nums}
guess = res | 1<<bit
for prefix in prefixSet:
if prefix^guess in prefixSet:
res=guess
break
return res