题目
数组中唯一只出现一次的数字
一、哈希表+队列
简单明了,哈希表+队列
def find_num_appear_once_1(arr):
if not arr:
return None
d = {}
q = []
for num in arr:
if num not in d:
d[num] = 1
q.append(num)
else:
if d[num] == 1:
q.remove(num)
d[num] += 1
return q[0]
二、位运算
思考一下数组的性质,除了我们要找的数字,其他数字都出现了3次。假设【3,3,3,5】
3 的二进制 011
3 的二进制 011
3 的二进制 011
5 的二进制 101
对这4个二进制数字分别按位求和:
134
对134按位分别除3取余~
101
真是妙蛙种子吃着妙脆角到了米奇妙妙屋,妙到家了~
def find_num_appear_once_2(arr):
count = [0] * 32
for num in arr:
k = 0
while k < 32:
count[k] += num >> k & 1
k += 1
res = 0
for i in range(32):
res += count[i] % 3 * 2 ** i
return res
不过这样的实现方式,效率不是很高~
三、位运算+有限状态自动机
具体思想参考力扣大神的思路:
https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-ii-lcof/solution/mian-shi-ti-56-ii-shu-zu-zhong-shu-zi-chu-xian-d-4/
def find_num_appear_once_3(arr):
ones, twos = 0, 0
for num in arr:
ones = ones ^ num & ~twos
twos = twos ^ num & ~ones
return ones