260. 只出现一次的数字 III
https://leetcode-cn.com/problems/single-number-iii/
解法一:
与136. 只出现一次的数字 不同之处在于要找的数字有两个。
用了一个很骚的操作diff & -diff,即与自身相反数与操作,得到的二进制数只有一个1(称为set bit),且是diff之中最右的1.
例如3和5
3^5=6:
011
^ 101
------
110
说明3和5从右边第二位开始不同
6是0110
-6是取反加一:0110 -> 1001 -> 1010
6&-6=2:
0110
&1010
------
0010
因此6&-6一定能得到最右边的1
根据和2与操作的结果,将所有数分成两组,则3和5一定划分到不同的组,每组之中再异或即可分别找出。
class Solution:
def singleNumber(self, nums: List[int]) -> List[int]:
diff = 0
for num in nums:
diff ^= num
diff &= -diff
res = [0, 0]
for num in nums:
if num & diff == 0: #分组
res[0] ^= num
else:
res[1] ^= num
return res
最后更新于