本文围绕小M希望确定比赛目标分数的问题,对码进行了详细的分析。我们处理了特殊情况(分数数量为1或2)和一般情况(分数数量大于2),并采用了排序和去重的方法来找到第三大的分数。
小M的目标分数计算
在编程比赛中,小M希望通过查看往届比赛的排名来确定自己的目标分数。他设定了一个具体的规则:如果分数中有三个或以上不同的分数,他希望找到其中第三大的分数作为目标;如果不同的分数只有两个或更少,他将选择最大的分数。
问题分析
-
输入参数:程序接收两个输入参数,一个是整数
n表示分数的数量,另一个是整数数组nums表示具体的分数。 -
特殊情况处理:
- 当
n为1时,只有一个分数,直接返回该分数。 - 当
n为2时,比较两个分数,返回较大的一个。
- 当
-
一般情况处理:
- 当
n大于2时,需要找到第三大的分数。由于数组可能包含重复分数,因此不能直接使用排序后的第三个元素。
- 当
-
输入:例如
n=4,nums=[2, 2, 3, 1]。 -
排序:将数组排序得到
[1, 2, 2, 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);
}
}
总结与知识点梳理
知识点梳理
-
排序算法:
- 排序是处理数组问题的常用手段,能够方便地找到最大值、最小值或特定位置的元素。
- Java中提供了多种排序方法,如
Arrays.sort(),它基于TimSort算法,具有O(n log n)的时间复杂度。
-
去重:
- 去重是处理包含重复元素数组时的关键步骤。
- 可以使用
HashSet等集合类来快速去重,因为集合类不允许重复元素。
-
条件判断与逻辑处理:
- 根据不同情况(如分数数量)进行条件判断,并采取相应的逻辑处理。
- 使用
if-else语句或switch-case语句来实现条件判断。
对其他入门同学的学习建议
-
掌握基础算法和数据结构:
- 熟练掌握排序、查找等基础算法,以及数组、集合等数据结构。
- 理解算法和数据结构的基本原理和适用场景。
-
多做练习:
- 通过大量的练习来巩固所学知识,提高编程能力。
- 尝试解决不同类型的问题,以拓展自己的思维方式和解题技巧。