题目来源:
一个整型数组 nums
里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
题目描述:
示例 1:
输入:nums = [4,1,4,6] 输出:[1,6] 或 [6,1]
代码实现:
def func(nums):
ret = functools.reduce(lambda x,y:x^=y,nums)
ins = 1
while ins&ret == 0:
ins <<= 1
a,b = 0,0
for n in nums:
if n&ins:
a ^= n
else:
b ^= n
return [a,b]
解题思路:
因为只有两个数字不同,其他都是两两一对,可以用异或,异或会将相同的数变成0,
最后剩下的ret其实就是两个不同的数字的异或结果
只要找到ret中位为1的那个位,说明两个数在这个位不一样
只要分成两组,就可以得到这两个数字
其他相同的数字异或都为0,在这一位都一样,异或就为0