问题描述
小M想要通过查看往届游戏比赛的排名来确定自己比赛的目标分数。他希望找到往届比赛中排名第三的分数,作为自己的目标。具体规则如下:
- 如果分数中有三个或以上不同的分数,返回其中第三大的分数。
- 如果不同的分数只有两个或更少,那么小M将选择最大的分数作为他的目标。
请你帮小M根据给定的分数数组计算目标分数。
解题思路
- 去重:首先需要去除数组中的重复元素,因为题目要求的是第三大的不同分数。
- 排序:将去重后的数组进行排序,从大到小。
- 返回结果:如果排序后的数组长度大于等于3,返回第三大的元素;否则返回最大的元素。
代码提示
我们可以使用Java中的Set来去重,然后使用List来存储去重后的元素,并进行排序。
以下是代码框架:
import java.util.*;
public class Main {
public static int solution(int n, int[] nums) {
// 使用Set去重
Set<Integer> set = new HashSet<>();
for (int num : nums) {
set.add(num);
}
// 将Set转换为List并排序
List<Integer> list = new ArrayList<>(set);
Collections.sort(list, Collections.reverseOrder());
// 返回第三大的元素,如果不足三个则返回最大的元素
if (list.size() >= 3) {
return list.get(2); // 第三大的元素
} else {
return list.get(0); // 最大的元素
}
}
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会自动去重。 - 排序:将
HashSet转换为ArrayList,并使用Collections.sort进行排序,Collections.reverseOrder()确保从大到小排序。 - 返回结果:根据排序后的列表长度,返回第三大的元素或最大的元素。
1. 集合框架(Collections Framework)
-
HashSet: 用于去重。
HashSet是一个不允许有重复元素的集合,适合用于去除数组中的重复元素。 -
ArrayList: 用于存储去重后的元素,并进行排序。
ArrayList是一个动态数组,适合用于存储和操作有序的元素。
2. 排序(Sorting)
-
Collections.sort: 用于对列表进行排序。
Collections.sort可以对List进行排序,默认是从小到大排序。 -
Comparator: 用于自定义排序规则。
Collections.reverseOrder()返回一个比较器,用于从大到小排序。
3. 条件判断
- if-else: 用于根据条件返回不同的结果。根据列表的长度判断是否存在第三大的元素。
4. 数组和集合的转换
-
数组到集合的转换: 通过遍历数组将元素添加到集合中。 `
-
集合到列表的转换: 通过构造函数将集合转换为列表。
List<Integer> list = new ArrayList<>(set);
5. 泛型(Generics)
- 泛型集合: 使用泛型集合可以确保集合中存储的元素类型一致,避免类型转换错误。
Set<Integer> set = new HashSet<>(); List<Integer> list = new ArrayList<>();
6. 算法复杂度
-
时间复杂度:
- 去重操作的时间复杂度为O(n),其中n是数组的长度。
- 排序操作的时间复杂度为O(m log m),其中m是去重后元素的个数。
- 总体时间复杂度为O(n + m log m)。
-
空间复杂度:
- 使用了一个
HashSet和一个ArrayList,空间复杂度为O(m),其中m是去重后元素的个数。
- 使用了一个
总结
这道题目综合运用了Java集合框架中的HashSet和ArrayList。