还是不会做,思路来自官解
- 对于整个数组按异或求和,可以得到只出现一次的两个数的异或值,通过这个值我们可以知道这两个数哪一位是相同的,哪一位是不同的
- 假设这两个数字最低的不同发生在第 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]