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

93 阅读3分钟

本文围绕小M希望确定比赛目标分数的问题,对码进行了详细的分析。我们处理了特殊情况(分数数量为1或2)和一般情况(分数数量大于2),并采用了排序和去重的方法来找到第三大的分数。

小M的目标分数计算

在编程比赛中,小M希望通过查看往届比赛的排名来确定自己的目标分数。他设定了一个具体的规则:如果分数中有三个或以上不同的分数,他希望找到其中第三大的分数作为目标;如果不同的分数只有两个或更少,他将选择最大的分数。

问题分析

  1. 输入参数:程序接收两个输入参数,一个是整数n表示分数的数量,另一个是整数数组nums表示具体的分数。

  2. 特殊情况处理

    • n为1时,只有一个分数,直接返回该分数。
    • n为2时,比较两个分数,返回较大的一个。
  3. 一般情况处理

    • n大于2时,需要找到第三大的分数。由于数组可能包含重复分数,因此不能直接使用排序后的第三个元素。

  1. 输入:例如n=4nums=[2, 2, 3, 1]

  2. 排序:将数组排序得到[1, 2, 2, 3]

  3. 寻找第三大的分数

    • 最大分数是3

    • 从最大分数开始向前查找,第一个不同的分数是2(但此时不能确定为第二大的,因为可能有重复)。

    • 继续向前查找,直到找到第二个不同的分数1,这就是第三大的分数。


public class Main {
    public static int solution(int n, int[] nums) {
        if(n==1){
            return nums[0];
        }else if(n==2){
            if(nums[0]<nums[1]){
                return nums[1];
            }else{
                return nums[0];
            }
        }else{
            Arrays.sort(nums);
            int max1 = nums[n - 1];
            int max2 = 0; // 初始化 max2
            int max3 = 0; // 初始化 max3
            int c = -1; // 初始化 c
            for (int i = n - 1; i >= 0; i--) {
                if (nums[i]!= max1) {
                    max2 = nums[i];
                    c = i;
                    break;
                }
            }
            if(c==-1) return max1;
            for (int i = c - 1; i >= 0; i--) {
                if (nums[i]!= max2) {
                    max3 = nums[i];
                    break;
                }
            }
            if(nums[0] == max2) return max1;
            return max3;
        }
    }
 
    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. 排序算法

    • 排序是处理数组问题的常用手段,能够方便地找到最大值、最小值或特定位置的元素。
    • Java中提供了多种排序方法,如Arrays.sort(),它基于TimSort算法,具有O(n log n)的时间复杂度。
  2. 去重

    • 去重是处理包含重复元素数组时的关键步骤。
    • 可以使用HashSet等集合类来快速去重,因为集合类不允许重复元素。
  3. 条件判断与逻辑处理

    • 根据不同情况(如分数数量)进行条件判断,并采取相应的逻辑处理。
    • 使用if-else语句或switch-case语句来实现条件判断。

对其他入门同学的学习建议

  1. 掌握基础算法和数据结构

    • 熟练掌握排序、查找等基础算法,以及数组、集合等数据结构。
    • 理解算法和数据结构的基本原理和适用场景。
  2. 多做练习

    • 通过大量的练习来巩固所学知识,提高编程能力。
    • 尝试解决不同类型的问题,以拓展自己的思维方式和解题技巧。