day4

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按位操作
&:按位与
|:按位或
^:按位异或
~:非
<<:左移
>>:右移

你可能感兴趣的:(day4)