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

69 阅读2分钟

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

题目要求:

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

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

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

思路分析:

本题的核心在于给定的分数数组的长度、数据不同,而我们首先需要明确不同的场景使用哪种方式,说白了就是分类讨论。

大概可以分位3种情况:

1、分数个数小于3个,且无重复元素:

可直接返回最大的分数

2、分数个数小于3个,且有重复元素:

即有2个元素或1个元素,此种情况也是直接返回一个元素即可

3、分数个数大于3个,且无重复元素:

可以先对分数数组进行排序,然后返回第三大的分数

4、分数个数大于3个,且有重复元素:

这种情况是最复杂,也是最容易漏掉的一种情况,如果只进行简单的排序,可能从数组中返回的分数不是第三大的,所以我们在排序后需要对数组进行一次查重,以此来保证第三大的分数是实际上的,并且在查重后的数组长度可能比3还要小

示例解释:

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

第一步:排序

这里以升序为例,得到的新数组为[1,2,2,3]

第二步:查重

可知2为重复元素,所以我们可以去除一个,得到新数组[1,2,3]

第三步:判断

数组个数3个,直接返回最小的,即返回1

实现方案:

排序:

在python中,带有原生的排序函数,即sort(),并且我们可以通过reverse来决定排序是正序还是倒序如newnums.sort(reverse=True)

查重:

该步骤可以通过 list(set(nums)) 将 nums 列表转换为集合(set),以去除其中的重复元素,然后再转换回列表(list),得到 newnums。这一步确保了后续处理的是没有重复元素的列表。

判断:

如果 newnums 的长度小于 3,即列表中去重后的元素不足 3 个,函数返回 newnums 中的第一个元素(此时也是最大的元素,因为列表已按降序排序)。

如果 newnums 的长度大于等于 3,函数返回 newnums 中的第三个元素(即降序排序后的第三大的元素)。