260. 只出现一次的数字 III (中等,位运算)

在这里插入图片描述
还是不会做,思路来自官解

  1. 对于整个数组按异或求和,可以得到只出现一次的两个数的异或值,通过这个值我们可以知道这两个数哪一位是相同的,哪一位是不同的
  2. 假设这两个数字最低的不同发生在第 l 位(因为两个数字不同,所以必有某一位是不同的),显然一个数字第 l 位为1,另一个数字第 l 位为0,并且对于其他出现两次的数字,将它们分为第 l 位为1和第 l 位为 0 的两类,每一数字的两次出现都会出现在同一类中,即我们分别对两类数字求异或和,重复出现的都会抵消,最终结果就是答案
class Solution:
    def singleNumber(self, nums: List[int]) -> List[int]:
        xorsum = 0
        for num in nums:
            xorsum ^= num
        
        lsb = xorsum & (-xorsum)
        type1 = type2 = 0
        for num in nums:
            if num & lsb:
                type1 ^= num
            else:
                type2 ^= num
        
        return [type1, type2]

你可能感兴趣的:(用Python刷力扣,算法,python,leetcode)