题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
题目链接
解题思路
通过位运算知识可以知道,两个完全相同的数进行异或后为零。则我们可以想到,如果一个数组中除了一个数以外其他的数都相同,则我们可以对数组中所有数进行异或后得到这个没有配对的数。
然而这里给的数组中有两个没有配对的数,则我们是否可以找到一种办法让这个两个没有配对的数分别分在两个数组中,且每个数组中除了一个没有配对的数外,其他的数都有配对了。
这时候 我们将所有的数进行异或得到的结果与这两个**‘孤独’**的数异或的结果是一样的,则,我们可以找到这个异或结果中的一个二进制位为1(该位的二进制为1,意味着这两个‘孤独’的数在该位上不一样)的位置,将这个数组分成我们想要的二个数组。然后分别对这两个数组求异或即可得到这两个‘孤独’的数了
# -*- coding:utf-8 -*-
class Solution:
# 返回[a,b] 其中ab是出现一次的两个数字
def FindNumsAppearOnce(self, array):
# write code here
if len(array)<=1:return array
bit = 0
for elem in array:bit ^= elem
loc = 0
while (bit >>loc)&1 != 1: loc += 1
left,right = [],[]
for elem in array:
if (elem>>loc)&1 == 1:left.append(elem)
else: right.append(elem)
a,b = 0,0
for elem in left:a ^= elem
for elem in right: b ^= elem
return [a,b]