LeetCode 260
如果所有的数都是成对出现的,那么所有的数xor之后的结果就是0. 里面有两个数是不同的,那么我们知道结果不是0,暂时记作(ones)。如果说我们的结果是a和b的话,那么就有a xor b = ones。所以只要找到其中的一个,我们就能得到另外一个。
在ones中找到其中的一个1的bit,对于这个bit,我们知道a和b是不一样的,通过这个bit,我们可以把数分成两个group,一个和a的这个bit是一样的,一个是和b的这个bit是一样。分别在这个两个group内做xor,我们就能得到a和b (因为其他的数都是成对出现的,xor之后等于0)。
def singleNumber(self, nums: List[int]) -> List[int]:
ones = 0
for v in nums:
ones ^= v
temp = ones
pos = 0
while(temp&1) ==0:
temp = temp >>1
pos +=1
firstDiffBit = 1 << pos
a = 0
for v in nums:
if v & firstDiffBit > 0:
a ^= v
return [a, ones ^ a]