一、题目描述
题目:数组中只出现一次的两个数
一个整型数组里除两个数字以外,其他数字都出现两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是 O ( n ) O(n) O(n) ,空间复杂度是 O ( 1 ) O(1) O(1) 。
例如,输入数组为 [2,4,3,6,3,2,5,5],输出 4 和 6 。
二、解题思路
暂略。(此处主要作为书中python实现补充)
三、代码实现
def FindNumsAppearOnce(arr):
if len(arr)<2:
return
resultExclusiveOR = 0
for i in range(len(arr)):
resultExclusiveOR = resultExclusiveOR ^ arr[i]
indexOfOne = FindFirstBitIsOne(resultExclusiveOR)
num1 = 0
num2 = 0
for i in range(len(arr)):
if IsBitOne(arr[i],indexOfOne):
num1 = num1^arr[i]
else:
num2 = num2^arr[i]
return num1,num2
def FindFirstBitIsOne(num):
'''
用于在整数num的二进制表示中找到最右边是1的位
'''
indexBit = 0
while (num & 1 == 0) and num != 0:
num = num>>1
indexBit = indexBit+1
return indexBit
def IsBitOne(num,indexOfOne):
'''
判断在num中的二进制表示中从右边数起的indexBit位是不是1
'''
num = num>>indexOfOne
return (num&0x1)
对以上函数进行简单的样例测试如下:
1)数组中多对重复的数字
>>> arr = [2,4,3,6,3,2,5,5]
>>> FindNumsAppearOnce(arr)
Out:
(4,6)
2)数组中没有重复的数字
>>> arr = [3,5]
>>> FindNumsAppearOnce(arr)
Out:
(3,5)