游戏排名第三大的分数| 豆包MarsCode AI 刷题

58 阅读3分钟

问题解析

在这道题目中,我们需要在一组给定的分数中找到排名第三的分数,作为目标分数。具体要求如下:

  1. 如果数组中有三个或以上不同的分数,则返回第三大的分数。
  2. 如果数组中不同的分数少于三个,则返回最大的分数。

这种问题在数据分析和比赛排名系统中非常常见,可以帮助用户了解排名情况和竞争对手的表现。

解题思路

去重和排序:首先,需要对输入数组进行去重,以便只保留不同的分数。然后,我们将去重后的分数按从大到小的顺序进行排序。

判断条件

  • 如果去重后的分数列表中元素个数大于等于3,返回排名第三的分数。
  • 如果去重后的分数少于3个,则返回最大的分数。

实现细节

  • 使用Python内置的set()函数来去除数组中的重复分数。
  • 使用sorted()函数将去重后的分数列表按降序排列,以便于直接索引第三大的分数。
  • 在索引时,使用列表下标[2]来获取第三大的元素。

代码实现

def solution(n: int, nums: list) -> int:
    # 去除重复的分数并按从大到小排序
    unique_scores = sorted(set(nums), reverse=True)
    
    # 检查是否有三个或更多不同的分数
    if len(unique_scores) >= 3:
        return unique_scores[2]  # 返回第三大的分数
    else:
        return unique_scores[0]  # 返回最大的分数

# 测试用例
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:输入 [3, 2, 1]。去重后得到 [3, 2, 1],第三大的数是1,输出1
  • 样例2:输入 [1, 2]。去重后得到 [2, 1],由于只有两个不同分数,输出最大的分数2
  • 样例3:输入 [2, 2, 3, 1]。去重后得到 [3, 2, 1],第三大的数是1,输出1

复杂度分析

  • 时间复杂度:O(n log n),其中n是数组的长度。set()去重的时间复杂度为O(n)sorted()排序的时间复杂度为O(n log n)
  • 空间复杂度:O(n),用于存储去重后的分数列表。

解题思考: 在解题过程中,要特别注意数组中可能会出现重复的分数。因此,去重是一个关键步骤,确保找到的是第三大不同的分数而非相同分数的重复。排序后选择第三大的分数需要用[2]下标来获取,理解Python中列表索引从0开始是必要的。

此外,针对数组长度和不同分数数量的判断也是解题的核心。通过条件len(unique_scores) >= 3来决定是返回第三大分数还是最大的分数,这个判断在题目中起着至关重要的作用,避免了数组长度不足三时索引越界的问题。