📅  最后修改于: 2023-12-03 15:42:17.874000             🧑  作者: Mango
给定一个整数数组 arr
,大小为 n
。现在,你需要找出这个数组中唯一出现奇数次的数字,并返回它。
def find_odd_occurring(arr: List[int]) -> int:
输入:
[1, 2, 3, 2, 3, 1, 3]
输出:
3
输入:
[2, 3, 3, 2, 3]
输出:
3
输入:
[1, 2, 3, 2, 3, 1]
输出:
-1
若一个数字出现了偶数次,则它的计数器为0。若一个数字出现了奇数次,则它的计数器为1。所以,将所有数字的计数器全部相加,如果总和为奇数,则说明只有一个数字出现了奇数次。此时,遍历所有的数字,找到计数器为1的数字即可;如果总和为偶数,则说明没有数字出现了奇数次。
def find_odd_occurring(arr: List[int]) -> int:
# 统计每个数字出现的次数
freq = {}
for num in arr:
freq[num] = freq.get(num, 0) + 1
# 统计所有数字的计数器
count = sum([v % 2 for v in freq.values()])
# 如果总和为偶数,则说明没有数字出现了奇数次
if count % 2 == 0:
return -1
# 遍历每个数字,找到计数器为1的数字
for num, c in freq.items():
if c % 2 == 1:
return num
该算法的时间复杂度为 $O(n)$,空间复杂度为 $O(n)$(需要一个辅助字典)。该算法能够通过本题。