1
这里使用到了python中的位运算,首先应该明白任何数和0做异或都是其本身,和其本身做异或都是0。然后很快就能想到进行分组。将数字分为两组,第一组中都是重复出现的数字,外加一个单独的数字;第二组中也是重复出现的数字,外加一个单独的数字。这样将第一组中所有元素做异或得到的就是单独的那个数字,第二组中也类似。这样就能找出那两个单独的数字。
接下来就是如何进行分组,我想了很久都没想出来,看官方答案才恍然大悟。
将所有元素异或,结果必不为0,转化成二进制数后必有至少一个位为1,随便选取一个为1的位,那两个不同的元素在这个位上不同,这样就一定有一个为0,一个为1,这个通过0,1就分开了这两个不同的元素。其他元素也一样,重复元素的所有位都相同,根据这一位是0还是1就能达到分组的效果。
代码如下:
class Solution:
def singleNumbers(self, nums: List[int]) -> List[int]:
single_res = 0
a,b = 0,0
bit = 1
for i in nums:
single_res ^= i
# single_res = functools.reduce(lambda x, y: x ^ y, nums)
while bit & single_res == 0:
bit <<= 1
for i in nums:
if i & bit:
a ^= i
else:
b ^= i
res = [a,b]
return res
python按位操作
&:按位与
|:按位或
^:按位异或
~:非
<<:左移
>>:右移