问题描述
小M想要通过查看往届游戏比赛的排名来确定自己比赛的目标分数。他希望找到往届比赛中排名第三的分数,作为自己的目标。具体规则如下:
- 如果分数中有三个或以上不同的分数,返回其中第三大的分数。
- 如果不同的分数只有两个或更少,那么小M将选择最大的分数作为他的目标。
请你帮小M根据给定的分数数组计算目标分数。
问题分析
算法步骤:
-
去重:
- 首先,我们需要去除数组中的重复分数,因为排名是基于不同的分数。
-
排序:
- 将去重后的分数进行降序排序,这样最大的分数会排在最前面。
-
确定目标分数:
- 检查排序后的分数数组长度。
- 如果数组长度大于或等于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个或更多,返回第三大的分数,即数组的倒数第三个元素。
易错点
-
去重错误:
- 忘记去重或者错误地使用数据结构去重,可能会导致重复的分数被错误地计算在内。
-
排序错误:
- 在排序时选择了错误的排序方法,例如应该使用降序排序,但错误地使用了升序排序。
- 忘记对数组进行排序,直接尝试访问第三大的元素。
-
数组索引错误:
- 在访问数组元素时使用了错误的索引。例如,在Java中数组索引是从0开始的,所以第三大的元素应该位于
length - 3,而不是length - 2。
- 在访问数组元素时使用了错误的索引。例如,在Java中数组索引是从0开始的,所以第三大的元素应该位于
-
边界条件处理不当:
- 当数组中不同的分数少于3个时,没有正确处理返回最大分数的情况。
- 没有检查数组是否为空,如果数组为空,应该有相应的处理逻辑。
-
参数使用错误:
- 如前所述,参数
n在方法中没有被使用,这可能导致混淆或误导。
- 如前所述,参数