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

49 阅读3分钟

问题描述

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

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

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

测试样例

样例1:

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

解题思路

本题的核心思路是利用 TreeSet 的特性来处理给定的分数数组,以找到符合规则的目标分数。TreeSet 是一种有序且不允许重复元素的数据结构,基于红黑树实现,它能自动对插入的元素进行排序。首先将分数数组中的元素添加到 TreeSet 中,利用其去重和排序的功能,然后根据 TreeSet 中元素的数量来确定目标分数。如果元素个数少于三个,按照规则直接返回最大的元素。若元素个数大于等于三个,则需要通过一定方式获取到其中第三大的元素作为目标分数。

因此本题我们将其分为两个大步骤:

1.数据处理与去重排序

创建一个 TreeSet 实例,用于存储分数数据。它会自动对插入的元素进行去重,并按照从小到大的顺序进行排序(基于其内部实现机制)。

通过循环遍历给定的分数数组 nums,将数组中的每个元素 num 使用 set.add(num) 方法添加到 TreeSet 中,这样 TreeSet 中就存放了经过去重且有序的分数集合。

2.根据元素数量确定目标分数

判断 TreeSet 的大小(即元素个数),如果 set.size() < 3,意味着不同的分数只有两个或更少,根据规则,此时应返回最大的分数。由于 TreeSet 是有序的,调用 set.last() 方法即可获取到其中最大的元素(也就是最后一个元素)作为目标分数返回。

如果 set.size() >= 3,说明分数中有三个或以上不同的分数,按照规则需要返回其中第三大的分数。先将 TreeSet 中的元素转换为数组形式,通过 set.toArray(new Integer[0]) 方法实现,这个方法会返回一个包含 TreeSet 中所有元素的 Integer 类型数组 sortedArray。然后,由于数组是有序的(从小到大),要获取第三大的元素,只需返回数组中倒数第三个元素,即 sortedArray[sortedArray.length - 3] 的值作为目标分数。

主要代码为:

1732723170468.png 通过上述代码实现的 solution 函数,能够依据给定的游戏比赛分数数组以及相应的规则,准确地计算出小 M 的目标分数。利用 TreeSet 的去重和排序特性简化了对分数数据的处理过程,通过合理的判断逻辑和数组操作,有效地获取到符合条件的目标分数。主函数中的测试用例展示了函数在不同输入情况下的预期表现,初步验证了函数功能的正确性,这种实现方式适用于解决此类需要根据特定排序和元素数量规则来获取目标数值的问题。