游戏排名第三大的分数
问题描述
小M想要通过查看往届游戏比赛的排名来确定自己比赛的目标分数。他希望找到往届比赛中排名第三的分数,作为自己的目标。具体规则如下:
如果分数中有三个或以上不同的分数,返回其中第三大的分数。 如果不同的分数只有两个或更少,那么小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 的目标分数。规则是:如果分数数组中有三个或更多不同的分数,就返回其中第三大的分数;而如果不同的分数只有两个或更少,那就选择最大的分数作为目标。
示例分析
- 样例 1:输入
n = 3(这里n表示数组nums的长度,不过其实在代码实现中不一定非要用到这个n,可以直接通过获取数组nums的长度来使用),nums = [3, 2, 1]。这个数组中有三个不同的分数3、2、1,按照规则,第三大的分数就是1,所以输出为1。 - 样例 2:输入
n = 2,nums = [1, 2]。这里数组中只有两个不同的分数,根据规则,此时应选择最大的分数作为目标,所以输出是2。 - 样例 3:输入
n = 4,nums = [2, 2, 3, 1]。数组中有三个不同的分数2、3、1,第三大的分数就是1,输出为1。
思路
排序法
- 首先对给定的分数数组
nums进行排序,可以使用常见的排序算法,排序后,数组中的元素会按照从小到大的顺序排列。 - 然后,我们从数组的末尾开始遍历,统计已经遍历过的不同分数的个数。
- 当遍历到的不同分数个数达到第三时,此时对应的分数就是我们要找的第三大的分数。如果在遍历完整个数组后,不同分数的个数都没有达到三个,那就说明不同分数只有两个或更少,按照规则,我们返回数组中的最大分数,也就是排序后数组的最后一个元素。
代码如下
import java.util.Arrays;
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);
}
}