算法刷题4| 豆包MarsCode AI刷题

72 阅读3分钟

一、题目分析

本题要求在给定的一组数字中,找出出现次数超过数字总数一半的那个数字。从题目描述可以知道,一定存在这样的数字,这是一个关键前提条件。例如在测试样例中给出的不同数组情况,我们需要通过一定的算法逻辑准确地找出那个符合要求的数字。

二、代码实现思路讲解

(一)使用字典统计数字出现次数

  1. 初始化字典
    代码首先定义了一个空字典 count_dictcount_dict = {}),这个字典的作用是用来存储每个数字以及它在给定数组中出现的次数。例如,对于数字 3,字典中对应的键值对可能是 {3: 5},表示数字 3 出现了 5 次(这里只是举例示意)。

  2. 遍历数组并更新字典
    接着通过一个 for 循环(for num in array:)来遍历输入的数组 array 中的每一个数字。在循环内部,使用了一个条件判断语句来处理字典中数字的计数问题:

    • 如果当前数字 num 已经在字典 count_dict 中了(通过 if num in count_dict: 判断),那就说明这个数字之前已经出现过了,此时将它在字典中对应的出现次数加 1count_dict[num] += 1)。
    • 如果当前数字 num 不在字典中,那就把这个数字添加到字典里,并且将它的出现次数初始化为 1count_dict[num] = 1)。这样,经过整个数组的遍历后,字典中就记录好了每个数字及其准确的出现次数。

(二)寻找符合条件的数字

  1. 计算数组长度的一半
    定义了变量 half_length,它的值通过将数组 array 的长度除以 2 取整得到(half_length = len(array) // 2)。这个值将作为判断一个数字出现次数是否超过半数的标准。
  2. 遍历字典进行判断
    再通过一个 for 循环(for num, count in count_dict.items():)来遍历刚才统计好的字典 count_dict。在每次循环中,会取出字典中的一个键值对,其中 num 表示数字,count 表示该数字的出现次数。然后通过条件判断语句 if count > half_length: 来检查当前数字的出现次数是否超过了数组长度的一半,如果超过了,就直接返回这个数字(return num),因为找到了符合题目要求的那个数字。

(三)异常情况处理

如果经过对整个字典的遍历,都没有找到出现次数超过数组长度一半的数字(虽然题目保证一定存在,但代码逻辑完整性上需要考虑这种情况),那么按照代码逻辑,最后会返回 0return 0)。不过在本题给定的条件下,正常是不会走到这一步返回 0 的,因为必然存在满足要求的数字。

三、测试样例分析

  
def solution(array):
    # 初始化一个空字典,用于存储每个数字及其出现次数
    count_dict = {}
    
    # 遍历数组中的每个数字
    for num in array:
        # 如果数字已经在字典中,则将其出现次数加1
        # 如果数字不在字典中,则将其添加到字典中,并设置出现次数为1
        if num in count_dict:
            count_dict[num] += 1
        else:
            count_dict[num] = 1
    
    # 遍历字典,找到出现次数超过数组长度一半的数字
    half_length = len(array) // 2
    for num, count in count_dict.items():
        if count > half_length:
            return num
    
    # 如果没有找到符合条件的数字,返回0(题目保证一定存在这样的数字)
    return 0

if __name__ == "__main__":
    # Add your test cases here
    print(solution([1, 3, 8, 2, 3, 1, 3, 3, 3]) == 3)

综上所述,这段代码通过合理地统计数字出现次数,并依据题目要求进行判断筛选,能够准确地找出给定数组中出现次数超过数字总数一半的那个数字,很好地解决了这道算法题。