题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
思路:
一个数和自己异或,得到的是0,在数组中如果一个数出现两次,则将所有数依次异或后,出现两次的数都会抵消为0。
本题中将所有数异或后,得到的是仅出现一次的两个数字异或后得到的结果。
如何将这两个数分离呢?
二进制异或时,两个数第i位上的值不同则异或后第i位为1,因此最后得到的结果上为1的位就是两个数不同的位。因此可以通过不同的位将原数组分为两组,根据上述思路,将每一组的数依次异或后出现两次的数会再次被消为0,最后只剩下只出现一次的数。
# -*- coding:utf-8 -*-
class Solution:
# 返回[a,b] 其中ab是出现一次的两个数字
def FindNumsAppearOnce(self, array):
# write code here
res=[]
if len(array)==2:
res.append(array[0])
res.append(array[1])
return res
num=0
for i in range(len(array)):
num^=array[i]#依次异或
index=0#记录第一个1的位置
while (num&1)==0:
num >>= 1
index+=1
res.append(0)
res.append(0)
for i in range(len(array)):
tmp=array[i]
tmp>>= index
if tmp &1:
res[0]^=array[i]
else:
res[1]^=array[i]
return res