题解 | 数组中只出现一次的两个数字
数组中只出现一次的两个数字
https://www.nowcoder.com/practice/389fc1c3d3be4479a154f63f495abff8
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param nums int整型一维数组
# @return int整型一维数组
#
class Solution:
def FindNumsAppearOnce(self , nums: List[int]) -> List[int]:
# write code here
# 法1 独创垃圾:先排序,若与相邻的元素相同,则不是答案,并跳过相邻元素的验证,
# 若不同,则就是答案,添加到answer中,直到rest=0
#时间O(n) 空间O(1)
# nums.sort()
# rest = 2 # 出现一次数字的个数
# answer = list()
# i = 0
# while i < len(nums):
# if rest==2 and i==len(nums)-2:#剩下两个并且还缺两个
# answer.append(nums[i])
# answer.append(nums[i+1])
# return (answer)
# if i >= len(nums) - 1 and rest == 1: # 就剩1个元素且答案还缺一个时候
# answer.append(nums[i])
# return(answer)
# if nums[i] == nums[i + 1]: # 直接跳过相同数的判断
# i += 1
# elif nums[i] != nums[i + 1]: # 与相邻的不同就是答案
# answer.append(nums[i])
# rest -= 1
# if rest == 0: # 没有了就返回答案
# return(answer)
# i += 1
#法2:异或法
res =[0, 0]
temp= 0
#遍历数组,将所有元素异或
#最后得到a^b
for i in range(len(nums)):
temp^=nums[i]
k=1
#找到两个数不相同的第一位(异或相同为0,不同为1)
while k&temp==0:
k<<=1
#分类异或,最后保证剩余的是答案
for i in range(len(nums)):
if k & nums[i]==0: #nums[i]与k两数不相同的位置值相同,分为一类
res[0]^=nums[i]
else:
res[1]^=nums[i] #不同,分为1类
res.sort()
return res

