一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
示例 1:
输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]
示例 2:
输入:nums = [1,2,10,4,1,4,3,3]
输出:[2,10] 或 [10,2]
限制:
2 <= nums <= 10000
class Solution:
# 1.数组所有元素^,相同的元素抵消,随后剩下两个单数的^为xor
# 2.对于上一步得到的xor,从右向左找到其二进制中的第一个1的位置index(两个数出现分歧的开始位置)
# 如:xor = 10101000,则记 low = 1000
# 3.将low和数组中所有元素 &,结果有两种, 数组中元素的二进制的index位为1的得到low,为0的得到0,这两组将相同元素分到一遍,而将那个两个不同元素恰好分开,故两组分别再^,就分别得到要求的两个数。
# 如:xxxx1xxxx & 1000 = 1000
# xxxx0xxxx & 1000 = 0000
def singleNumbers(self, nums: List[int]) -> List[int]:
xor = 0
for i in nums:
xor = xor ^ i
low = xor & (-xor)
r1 = 0
r2 = 0
for i in nums:
if i & low == 0:
r1 = r1 ^ i
else:
r2 = r2 ^ i
return [r1, r2]