给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。
进阶:你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?
第一种:哈希表
def singleNumber(self, nums: List[int]) -> List[int]:
dictionary = Counter(nums)
return [num for num, occ in dictionary.items() if occ == 1]
第二种:异或
def singleNumber(self, nums: List[int]) -> List[int]:
xorsum = 0
for num in nums:
#相同的消除,剩下的是唯二不同的
xorsum ^= num
#二进制中,唯二不同的数字转为二进制后不相同的最小位数:111,101-->2
lsb = xorsum & -xorsum
num1 = num2 = 0
for num in nums:
#根据最小位数的不同进行分类
if num & lsb:
#相同的消除,大浪淘沙,学渣留下来了
num1 ^=num
else:num2 ^=num
return [num1, num2]