解题思路:主要运行如下两个规律(1)任何数和零异或得到原数(2)两个相等的数异或为零,整个数组异或后得到两个不同的数(a, b)的异或值,然后找到最右边a和b不同的位,利用这一位上的0和1将数组的数分为两组进行异或,相同的数肯定会被分到同一组,然后异或之后又为零,所以最后的保留下来的就是原来两个不相等的数
class Solution:
def singleNumbers(self, nums: List[int]) -> List[int]:
res = []
tmp = 0
size = len(nums)
for i in range(size):
tmp ^= nums[i]
n = 1
#找到a,b最右边不同的位
while(n & tmp ==0):
n <<= 1
a, b = 0, 0
for i in range(size):
if nums[i] & n:
a ^= nums[i]
else:
b ^= nums[i]
return [a, b]