题目一:数组中只出现一次的2个数字
一个整型数组里除了两个数字外,其他数字都出现了2次,清编写程序找出来这2个数字,要求时间复杂度为O(n),空间复杂度为O(1)。
思路:本题对时间复杂度要求,如果没有要求可以用以往的方法,先pop,然后在in判断,这里采用了位运算--异或。
1 先把数组中的每个元素异或,最后得到的是要找的2个数字的异或结果,因为相同数字异或结果为0
2 根据异或结果中的为1的位将数组中的数字分为2个类,他们每组只包含一个出现次数为1次的数
3 再将每个组异或就可以得到这2个数字了
class Solution:
def xor(self,L):
if L is None:
return None
result_xor = 0
for i in L: #数组异或得到result_xor
result_xor = result_xor ^ i
#找第一个1
indexOf1 = self.find_first1(result_xor)
n, m = 0, 0
for i in L:
if self.IsBit(i, indexOf1):
n = n ^ i
else:
m = m ^ i
return n, m
def IsBit(self, num, inde_bit):
num = num >> inde_bit
return num & 1
def find_first1(self, result):
index = 0
while result & 1 == 0:
result = result >> 1
index += 1
return index
题目2:数组中唯一出现一次的数字
在一个数组里除了一个数字出现一次之外,其他数字都出现了3次,请找出出现一次的数字
思路:把每个数字用二进制表示,然后将各位加起来,对应的位数能被3整除就可以,不能被3整除的就是最后要得到的数字
class Solution:
def appear1(self, L):
if L is None:
return None
bitSum = list(range(28*4))
for i in L:
bitMask = 1
for j in range(28*4):
bit = i & bitMask
if bit != 0:
bitSum[111-j] += 1
bitMask = bitMask << 1
result = 0
for i in range(112):
result = result << 1
result = bitSum[i]%3
return result