AI刷题的自我反思(四)

93 阅读3分钟

问题描述

小M想要通过查看往届游戏比赛的排名来确定自己比赛的目标分数。他希望找到往届比赛中排名第三的分数,作为自己的目标。具体规则如下:

  1. 如果分数中有三个或以上不同的分数,返回其中第三大的分数。
  2. 如果不同的分数只有两个或更少,那么小M将选择最大的分数作为他的目标。

请你帮小M根据给定的分数数组计算目标分数。

测试样例

样例1:

输入:n = 3,nums = [3, 2, 1]
输出:1

针对问题的思路:

  1. 去重:首先需要去除数组中的重复元素,因为题目要求的是第三大的唯一分数。
  2. 排序:将去重后的数组进行排序,以便找到第三大的元素。
  3. 判断:如果去重后的数组长度小于3,则返回最大的分数;否则返回第三大的分数。

算法步骤

  1. 去重:使用Python的集合(set)来去除重复元素。
  2. 排序:将去重后的集合转换为列表并进行排序。
  3. 判断并返回结果:根据排序后的列表长度,返回相应的分数。
  • unique_nums = list(set(nums)):将数组转换为集合以去除重复元素,然后再转换回列表。
  • unique_nums.sort():对去重后的列表进行排序。
  • if len(unique_nums) < 3:判断去重后的列表长度是否小于3,如果是,则返回最大的分数;否则返回第三大的分数。

代码实现

    # 去重
    unique_nums = list(set(nums))
    
    # 排序
    unique_nums.sort()
    
    # 判断并返回结果
    if len(unique_nums) < 3:
        # 如果唯一分数的数量少于三个,返回最大的分数
        return unique_nums[-1]
    else:
        # 否则返回第三大的分数
        return unique_nums[-3]

if __name__ == '__main__':
    print(solution(3, [3, 2, 1]) == 1)
    print(solution(2, [1, 2]) == 2)
    print(solution(4, [2, 2, 3, 1]) == 1)

解题总结

  1. 去重处理

    • 使用集合 set(nums) 去除重复元素,得到所有不同的分数。
    • 集合自动去重,但需要转换回列表以便排序。
  2. 排序处理

    • 使用 sorted(unique_scores, reverse=True) 对不同的分数进行降序排序。
    • reverse=True 参数使排序结果从大到小排列。
  3. 目标分数确定

    • 检查不同分数的数量。
    • 如果数量大于或等于3,返回第三大的分数。
    • 如果数量小于3,返回最大的分数。

解题感悟

  1. 问题分解

    • 将大问题分解成多个小问题,逐步解决。首先去重,然后排序,最后确定目标分数。
  2. 数据结构的选择

    • 使用集合可以方便地去除重复元素,但需要转换回列表进行排序。
    • 集合的去重功能使得代码更加简洁。
  3. 条件判断

    • 通过简单的条件判断来确定目标分数,逻辑清晰易懂。
    • 条件判断语句的顺序和逻辑关系要清晰,确保逻辑正确无误。
  4. 代码简洁性

    • 代码尽量简洁,避免冗余。每一步都尽量简洁地完成任务。
    • 使用内置函数和标准库可以提高代码的可读性和效率。
  5. 测试样例

    • 提供多种测试样例,确保代码在不同情况下都能正确工作。特别是边界情况,如数组中只有两个不同的分数或只有一个分数的情况。