题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。
方法一:字典
# -*- coding:utf-8 -*-
class Solution:
# 返回[a,b] 其中ab是出现一次的两个数字
def FindNumsAppearOnce(self, array):
num_dict = dict()
for num in array:
if num in num_dict:
num_dict[num] += 1
else:
num_dict[num] = 1
res = []
for key, val in num_dict.items():
if val == 1:
res.append(key)
return res
时间复杂度为O(n),空间复杂度为O(n),并不是很优雅。
方法二:位运算
# -*- coding:utf-8 -*-
class Solution:
# 返回[a,b] 其中ab是出现一次的两个数字
def FindNumsAppearOnce(self, array):
if not array:
return []
tmp = 0
# 对array中数进行异或
for i in array:
tmp ^= i
# 找到tmp中最低位为1的index
index = 0
while (tmp & 1) == 0:
tmp >>= 1
index += 1
# 两组数分别异或
a = b = 0
for i in array:
if self.isBit(i, index):
a ^= i
else:
b ^= i
return [a, b]
def isBit(self, num, index):
num >>= index
return num & 1
时间复杂度O(n),空间复杂度为O(1)
-------------------------------------------------------------------------------------------------------------------------------------
更多题目包括leetcode、牛客网、各种排序算法解法参见个人GitHub,持续更新中,欢迎star ~~
https://github.com/PemLer/Journey_of_leetcode
-------------------------------------------------------------------------------------------------------------------------------------