一、题目
问题描述
小M想要通过查看往届游戏比赛的排名来确定自己比赛的目标分数。他希望找到往届比赛中排名第三的分数,作为自己的目标。具体规则如下:
- 如果分数中有三个或以上不同的分数,返回其中第三大的分数。
- 如果不同的分数只有两个或更少,那么小M将选择最大的分数作为他的目标。
请你帮小M根据给定的分数数组计算目标分数。
测试样例
样例1:
输入:
n = 3,nums = [3, 2, 1]输出:1
样例2:
输入:
n = 2,nums = [1, 2]输出:2
样例3:
输入:
n = 4,nums = [2, 2, 3, 1]输出:1
二、解题思路
题目要求从给定的分数列表中找出第三大的不同分数。如果列表中不同的分数少于三个,则返回列表中的最大值。 在解题和思考过程中,遇到的主要难点在于: 去除重复分数:在Python中,如何有效地去除列表中的重复元素? 判断不同分数的数量:如何确定处理后的集合中元素的数量? 排序与选择:如何从集合中快速找到第三大的元素? 特殊情况处理:当不同的分数少于三个时,需要返回最大的分数。
主要分为以下三个板块,首先对重复元素去重,这个可以用到set,然后按题目要求分为两种逻辑解题,即数量小于3和大于等于3:
1.如何有效地去除列表中的重复元素?
解决方案为:使用set数据结构。集合自动去除重复元素。
题解中即如下:
unique_nums = set(nums)
2.逻辑1:如果分数数量小于3,则直接返回最大值。
题解即如下:
if len(unique_nums) < 3:
return max(unique_nums)
3.逻辑2:如果不满足逻辑1,则排序并返回其中第三大的数。
这里要注意要获取排名第三位的数应该在sorted_num中索引为2,题解即如下:
sorted_nums = sorted(unique_nums, reverse=True)
return sorted_nums[2]
三、题解
综上所述,最终的题解如下:
def solution(n: int, nums: list) -> int:
# 使用集合去重,确保每个分数只出现一次
unique_nums = set(nums)
# 如果不同的分数少于3个,直接返回最大值
if len(unique_nums) < 3:
return max(unique_nums)
# 否则,转换为列表并排序,取倒数第三个元素
sorted_nums = sorted(unique_nums, reverse=True)
return sorted_nums[2]
整体看来,我认为本题解题的关键在于利用集合去除重复元素,然后根据不同的情况选择合适的逻辑来返回结果。