题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
解题思路:
这道题我们需要先从它的简化版本看,假如一个数组中除了一个数字出现一次,其它数字都出现两次,找出这个数字。
我们可以考虑用异或的方法去做,为什么呢?
首先,异或满足交换律,即1^2^3=3^2^1=2^1^3=2^3^1=1^3^2=3^1^2。
同时,如果一个数字与自己异或等于0,而一个数字与0异或等于自己。
即假如数组是a,b,c,b,a,那么a^b^c^b^a=a^a^b^b^c=0^0^c=c。
所以代码如下:
import functools
class Solution:
# 返回[a,b] 其中ab是出现一次的两个数字
def FindNumsAppearOnce(self, array):
# write code here
return functools.reduce(lambda x,y:x^y ,array)
而有两个只出现一次的数字呢?
最后的异或结果必为两个数字的异或,因为两个数字不同,所以结果必不为0,那么这个结果的二进制就有一位是1,那么这两个数字的二进制在这一位必定一个是1,一个是0,那么我们根据这一位是1还是0来划分数组,因为相同的数字必定会划分到同一个数组,而这两个数字必定会划分到不同的数组,那么新的数组除了各自只出现一次的数字,其余数字都是两两相同的,那么就分解成上面的问题了。
代码:
import functools
class Solution:
def FindNumsAppearOnce(self, array):
if not array: return []
temp = functools.reduce(lambda x, y: x ^ y, array)
index = 0
while temp & 1 == 0:
temp =temp >> 1
index+=1
x=y=0
for i in array:
if (i>>index & 1) == 0 :
x^=i
else:
y^=i
return [x,y]
当然,我们也可以用hashmap的方法来做,这里就不赘述了。