Single Number III
题目描述
Given 2*n + 2
numbers, every numbers occurs twice except two, find them.
Example
Given [1,2,2,3,4,4,5,3]
return 1
and 5
Challenge
O(n)
time, O(1)
extra space.
解题方法
- 全部异或,然后对结果找到第一个为1的bit, 这个bit必然是两个single number不一样的Bit
- 对于这个bit,将原来的数组分为两组
- 然后再按照single number的方法分别找到两个数
不用extra space的做法
我们已经知道消去从右到左第一个1 bit的方法是x & (x-1)
, 那么我们将x-1
的bit flip一下变为~(x-1)
, 再x & (~(x-1))
,就可以
得到一个只有这一个bit位1的mask, 然后通过这个mask来直接在loop中分组做xor, 就像single number i一样可以找到两个single number
Solution
class Solution(object):
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
if not nums:
return []
xor = 0
for num in nums:
xor ^= num
a = 0
b = 0
bitMask = xor & (~(xor-1))
for num in nums:
if num & bitMask:
a ^= num
else:
b ^= num
return [a, b]