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

96 阅读3分钟

问题描述

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

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

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

解题思路

  1. 去重:首先需要去除数组中的重复元素,因为题目要求的是第三大的不同分数。
  2. 排序:将去重后的数组进行排序,从大到小。
  3. 返回结果:如果排序后的数组长度大于等于3,返回第三大的元素;否则返回最大的元素。

代码提示

我们可以使用Java中的Set来去重,然后使用List来存储去重后的元素,并进行排序。

以下是代码框架:

import java.util.*;

public class Main {
    public static int solution(int n, int[] nums) {
        // 使用Set去重
        Set<Integer> set = new HashSet<>();
        for (int num : nums) {
            set.add(num);
        }
        
        // 将Set转换为List并排序
        List<Integer> list = new ArrayList<>(set);
        Collections.sort(list, Collections.reverseOrder());
        
        // 返回第三大的元素,如果不足三个则返回最大的元素
        if (list.size() >= 3) {
            return list.get(2); // 第三大的元素
        } else {
            return list.get(0); // 最大的元素
        }
    }

    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);
    }
}

关键步骤解释

  1. 去重:使用HashSet来存储数组中的元素,HashSet会自动去重。
  2. 排序:将HashSet转换为ArrayList,并使用Collections.sort进行排序,Collections.reverseOrder()确保从大到小排序。
  3. 返回结果:根据排序后的列表长度,返回第三大的元素或最大的元素。

1. 集合框架(Collections Framework)

  • HashSet: 用于去重。HashSet是一个不允许有重复元素的集合,适合用于去除数组中的重复元素。

  • ArrayList: 用于存储去重后的元素,并进行排序。ArrayList是一个动态数组,适合用于存储和操作有序的元素。

2. 排序(Sorting)

  • Collections.sort: 用于对列表进行排序。Collections.sort可以对List进行排序,默认是从小到大排序。

  • Comparator: 用于自定义排序规则。Collections.reverseOrder()返回一个比较器,用于从大到小排序。

3. 条件判断

  • if-else: 用于根据条件返回不同的结果。根据列表的长度判断是否存在第三大的元素。

4. 数组和集合的转换

  • 数组到集合的转换: 通过遍历数组将元素添加到集合中。 `

  • 集合到列表的转换: 通过构造函数将集合转换为列表。

    List<Integer> list = new ArrayList<>(set);
    

5. 泛型(Generics)

  • 泛型集合: 使用泛型集合可以确保集合中存储的元素类型一致,避免类型转换错误。
    Set<Integer> set = new HashSet<>();
    List<Integer> list = new ArrayList<>();
    

6. 算法复杂度

  • 时间复杂度:

    • 去重操作的时间复杂度为O(n),其中n是数组的长度。
    • 排序操作的时间复杂度为O(m log m),其中m是去重后元素的个数。
    • 总体时间复杂度为O(n + m log m)。
  • 空间复杂度:

    • 使用了一个HashSet和一个ArrayList,空间复杂度为O(m),其中m是去重后元素的个数。

总结

这道题目综合运用了Java集合框架中的HashSetArrayList