【题目】:
方法一:
分析:1.将所有数进行异或,消除数组中出现两次的数(可见leetcode136题);
2.由于题目中有两个出现一次的数,因此需要将其分组;
3.使用a&(-a)来将数分离(-a为补码,也就是a取反+1).
a&(-a)保留a最右边的1,因此可以区分两个不同的数
class Solution:
def singleNumber(self, nums: int) -> List[int]:
# 消除数组中出现两次的数
ret = 0
for num in nums:
ret ^= num
# 区分两个出现次数为1的数
diff = ret & (-ret)
x = 0
for num in nums:
if num & diff:
x ^= num
return [x, ret^x]
方法二:
分析:1.将出现一次的数放到集合set1中;
2.将再次出现的数放到集合set2中;
3.取两个集合的差,即set1 - set2,便能找出集合中不同的数。
集合的差表示集合1中包含,而集合2中不包含的数。
class Solution:
def singleNumber(self, nums: List[int]) -> List[int]:
a, b = set(), set()
for num in nums:
if num not in a:
a.add(num)
else:
b.add(num)
return (a - b)