classSolution:defsingleNumbers(self, nums: List[int])-> List[int]:"""
对所有数字进行异或操作,最后的异或值操作一定是两个只出现一次的值
functools.reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
function 为 x + y,sequence 为 [1, 2, 3, 4, 5],未给出 initial,所以:
第一次计算 (1 + 2)
第二次计算 ((1 + 2) + 3)
…
整个过程就是:((((1+2)+3)+4)+5) = 15
"""# 两两元素进行异或
ret = functools.reduce(lambda x,y:x^y,nums)
div =1# 从右往左去找异或结果中第一位为1的所有元素,按照这个进行分组,因为两个元素分开啦# 因为为1就表示这两个数字在当前位上不相同while div & ret ==0:
div <<=1
a,b =0,0# 分组之后的数字,对分组内的元素进行异或for n in nums:# 就是当前位为1if n & div:
a ^= n
else:# 当前位为0
b ^= n
return[a,b]
classSolution:defsingleNumber(self, nums: List[int])->int:"""
对每一位上的1进行相加
对每一位1的个数进行取余
剩下的每一位的值则是最终的值
"""
counts =[0]*32# 统计每一位上的1的个数for num in nums:for j inrange(32):
counts[j]+= num &1
num >>=1
res =0# 取余
m =3for i inrange(32):
res <<=1
res |= counts[31-i]% m
return res if counts[31]%m ==0else~(res^0xffffffff)