青训营X豆包MarsCode 游戏排名第三大分数|豆包MarsCode AI刷题

49 阅读3分钟

问题描述

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

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

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

问题分析

算法步骤:

  1. 去重

    • 首先,我们需要去除数组中的重复分数,因为排名是基于不同的分数。
  2. 排序

    • 将去重后的分数进行降序排序,这样最大的分数会排在最前面。
  3. 确定目标分数

    • 检查排序后的分数数组长度。
    • 如果数组长度大于或等于3,则取排序后数组的第三个元素作为目标分数。
    • 如果数组长度小于3,则取排序后的第一个元素(即最大分数)作为目标分数

代码片段

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class Main {
    public static int solution(int n, int[] nums) {
        // 使用Set来存储不同的分数
        Set<Integer> uniqueScores = new HashSet<>();
        for (int num : nums) {
            uniqueScores.add(num);
        }

        // 将Set转换为数组并排序
        Integer[] uniqueArray = uniqueScores.toArray(new Integer[0]);
        Arrays.sort(uniqueArray);

        // 如果不同的分数少于3个,返回最大值
        if (uniqueArray.length < 3) {
            return uniqueArray[uniqueArray.length - 1];
        }

        // 返回第三大的分数
        return uniqueArray[uniqueArray.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);
    }
}

代码分析

  • 我们创建了一个HashSet来存储不同的分数,因为HashSet不允许重复元素。
for (int num : nums) {
    uniqueScores.add(num);
}
  • 通过增强型for循环遍历数组nums,并将每个分数添加到HashSet中。
Integer[] uniqueArray = uniqueScores.toArray(new Integer[0]);
Arrays.sort(uniqueArray);
  • HashSet转换为数组uniqueArray,然后使用Arrays.sort方法对其进行升序排序。
if (uniqueArray.length < 3) {
    return uniqueArray[uniqueArray.length - 1];
}
  • 如果数组中的不同分数少于3个,返回数组中的最大值,即数组的最后一个元素。
return uniqueArray[uniqueArray.length - 3];
  • 如果数组中的不同分数有3个或更多,返回第三大的分数,即数组的倒数第三个元素。

易错点

  1. 去重错误

    • 忘记去重或者错误地使用数据结构去重,可能会导致重复的分数被错误地计算在内。
  2. 排序错误

    • 在排序时选择了错误的排序方法,例如应该使用降序排序,但错误地使用了升序排序。
    • 忘记对数组进行排序,直接尝试访问第三大的元素。
  3. 数组索引错误

    • 在访问数组元素时使用了错误的索引。例如,在Java中数组索引是从0开始的,所以第三大的元素应该位于length - 3,而不是length - 2
  4. 边界条件处理不当

    • 当数组中不同的分数少于3个时,没有正确处理返回最大分数的情况。
    • 没有检查数组是否为空,如果数组为空,应该有相应的处理逻辑。
  5. 参数使用错误

    • 如前所述,参数n在方法中没有被使用,这可能导致混淆或误导。