游戏排名第三大的分数题解

94 阅读3分钟

游戏排名第三大的分数

问题描述

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

  1. 如果分数中有三个或以上不同的分数,返回其中第三大的分数。
  2. 如果不同的分数只有两个或更少,那么小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

题解

为了帮助小M找到目标分数,我们设计了一个高效的算法,该算法充分利用了 TreeSet 数据结构的特性,结合自动去重和排序的功能,使得问题的解决变得简洁而高效。

算法步骤详解

  1. 去重并排序
    由于分数数组可能包含重复分数,且我们需要按照分数大小排序,TreeSet 是一种非常合适的数据结构。

    • TreeSet 会自动去掉重复的分数,同时将分数按照从小到大的顺序存储,无需手动进行排序操作。
    • 例如,对于数组 [2, 2, 3, 1],经过 TreeSet 处理后,将变为 {1, 2, 3}
  2. 判断集合大小
    根据题目规则:

    • 如果不同的分数少于三个(集合大小小于 3),直接返回集合中的最大值。
    • 使用 set.last() 方法可以直接获取 TreeSet 中的最大值。例如,对于 {1, 2},最大值为 2
  3. 返回第三大的值
    如果集合大小大于等于 3,则需要返回第三大的分数:

    • 由于 TreeSet 是有序集合,我们可以将其转换为数组(通过 set.toArray(new Integer[0])),然后访问倒数第三个元素。
    • 假设集合为 {1, 2, 3, 4, 5},转换为数组后是 [1, 2, 3, 4, 5],倒数第三个元素即为 3

Java 实现

import java.util.TreeSet;

public class Main {
    public static int solution(int n, int[] nums) {
        // 使用 TreeSet 来存储不同的分数
        TreeSet<Integer> set = new TreeSet<>();
        for (int num : nums) {
            set.add(num);
        }
        
        // 如果集合大小小于3,返回最大值
        if (set.size() < 3) {
            return set.last(); // last() 返回集合中的最大值
        }
        
        // 返回第三大的值
        // 使用 toArray 方法获取倒数第三个元素
        Integer[] array = set.toArray(new Integer[0]);
        return array[array.length - 3];
    }

    public static void main(String[] args) {
        System.out.println(solution(3, new int[]{3, 2, 1}) == 1);
        System.out.println(solution(2, new int[]{1, 2}) == 2);
        System.out.println(solution(4, new int[]{2, 2, 3, 1}) == 1);
    }
}

关键步骤

  • 使用 TreeSet 来存储不同的分数:这样可以自动去重并按升序排序。
  • 判断集合大小:如果集合的大小小于3,直接返回集合中的最大值。
  • 返回第三大的值:如果集合的大小大于等于3,返回集合中的倒数第三个元素。