📜  门| GATE-CS-2015(套装2)|第 48 题(1)

📅  最后修改于: 2023-12-03 15:42:17.874000             🧑  作者: Mango

题目描述

给定一个整数数组 arr,大小为 n。现在,你需要找出这个数组中唯一出现奇数次的数字,并返回它。

函数签名

def find_odd_occurring(arr: List[int]) -> int:
输入参数
  • arr: List[int] - 整数数组
输出参数
  • int - 唯一出现奇数次的数字

示例

示例1

输入:

[1, 2, 3, 2, 3, 1, 3]

输出:

3
示例2

输入:

[2, 3, 3, 2, 3]

输出:

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)$(需要一个辅助字典)。该算法能够通过本题。