1. leetcode刷题笔记
这个如果用哈希表,那就和昨天的差不多。位运算的思路就难理解一点。
class Solution:
def singleNumber(self, nums: List[int]) -> List[int]:
freq = Counter(nums)
rslt = []
for c, n in freq.items():
if n==1:
rslt.append(c)
return rslt
位运算方法
将nums中所有数相异或,x = x1 ⊕ x2 ⊕ …… ⊕xn,由于相同的两个数配对相消,剩下的就是两个不相等的数(设为x01,x02)的异或结果:x = x01⊕x02
① 1个数x与自己的相反数相与,x&(-x),得到的数的二进制表示只有一位为1,而该位是x的最低为1的一位(记为i)。
eg:
5&(-5) = 0101 & 1011 = 0001 (i = 0)
x = x01⊕x02,第i位同时也是x01和x02不相等的最低位
② 以这个作为特征来将nums中的数字分为两类:第i为为1的;第i位为0的。则x01和x02会被分到不同组。
在这两个组里分别求异或和,最终得到的两个数即为x01和x02