题目描述
一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
输入输入示例
输入:[1,4,1,6]
返回值:[4, 6]
说明:
返回的结果中较小的数排在前面
代码示例
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param array int整型一维数组
# @return int整型一维数组
#
class Solution:
def FindNumsAppearOnce(self , array ):
# write code here
if len(array) < 2:
return None
# 遍历数组,将所有数组中的数进行异或
# twoNumXor表示为数组异或后的值
twoNumXor = None
for num in array:
if twoNumXor == None:
twoNumXor = num
else:
twoNumXor = twoNumXor ^ num
# 因为数组中只有两个数字只出现一次,所以此时异或的结果是这两个数字的异或结果
# 查找异或结果中最右边的1
count = 0
# 例:twoNumXor == 0110=6
while twoNumXor % 2 == 0:
# twoNumXor = twoNumXor // 2
twoNumXor = twoNumXor >> 1
# twoNumXor ==> 0011
count += 1
# 只保留最右边的第一个1 count=1
# 1 << 1----> 10
mask = 1 << count
firstNum = None
secondNum = None
# 此时用mask(10)与数组中的每一个数进行与&操作
for num in array:
# 与的结果分两种,一种是0,一种是1
if mask & num == 0:
# 0的情况的数为一组并进行异或,异或后的结果为出现一次的数
if firstNum == None:
firstNum = num
else:
firstNum = firstNum ^ num
# 1的情况的数为一组并进行异或,异或后的结果为另一个出现一次的数
else:
if secondNum == None:
secondNum = num
else:
secondNum = secondNum ^ num
if firstNum <= secondNum:
return firstNum, secondNum
else:
return secondNum, firstNum