华为机试-0003-统计射击比赛成绩
华为机试-0003-统计射击比赛成绩题目描述完整代码代码解释代码结构与功能
更多内容欢迎关注我(持续更新中,欢迎Star✨)
Github:CodeZeng1998/Java-Developer-Work-Note
技术公众号:CodeZeng1998(纯纯技术文)
生活公众号:好锅(Life is more than code)
其他平台:CodeZeng1998、好锅
题目描述
统计射击比赛成绩 给定一个射击比赛成绩单 包含多个选手若干次射击的成绩分数请对每个选手按其最高三个分数之和进行降序排名 输出降序排名后的选手id序列 条件如下 1.一个选手可以有多个射击成绩的分数,且次序不固定
2.如果一个选手成绩少于3个,则认为选手的所有成绩无效,排名忽略该选手
3.如果选手的成绩之和相等,则相等的选手按照其id降序排列
输入描述:
输入第一行
一个整数N
表示该场比赛总共进行了N次射击
产生N个成绩分数
2<=N<=100
输入第二行
一个长度为N整数序列
表示参与每次射击的选手id
0<=id<=99
输入第三行
一个长度为N整数序列表示参与每次射击选手对应的成绩
0<=成绩<=100
输出描述:
符合题设条件的降序排名后的选手ID序列
示例一 输入:
13 3,3,7,4,4,4,4,7,7,3,5,5,5 53,80,68,24,39,76,66,16,100,55,53,80,55
输出:
5,3,7,4
说明: 该场射击比赛进行了13次
参赛的选手为{3,4.5.7}
3号选手成绩53,80,55 最高三个成绩的和为188
4号选手成绩24,39,76,66 最高三个成绩的和为181
5号选手成绩53,80,55 最高三个成绩的和为188
7号选手成绩68.16,100 最高三个成绩的和为184
比较各个选手最高3个成绩的和
有3号=5号>7号>4号
由于3号和5号成绩相等 且id 5>3
所以输出5,3.7.4
完整代码
import java.util.*;
import java.util.stream.Collectors;
public class StatisticsOfShootingCompetitionResults {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入总共进行了多少次射击:");
int n = Integer.parseInt(scanner.nextLine());
System.out.println("请输入每次射击的选手的id(多个之间用英文逗号分割):");
List<Integer> idList =
Arrays.stream(scanner.nextLine().split(","))
.limit(n)
.map(Integer::parseInt)
.collect(Collectors.toList());
System.out.println("请输入每次射击的选手的分数(多个之间用英文逗号分割):");
List<Integer> sorceList =
Arrays.stream(scanner.nextLine().split(","))
.limit(n)
.map(Integer::parseInt)
.collect(Collectors.toList());
scanner.close();
Map<Integer, List<Integer>> resultMap = new HashMap<>();
for (int i = 0; i < n; i++) {
Integer id = idList.get(i);
Integer score = sorceList.get(i);
if (!resultMap.containsKey(id)) {
resultMap.put(id, new LinkedList<>());
}
List<Integer> itemSorceList = resultMap.get(id);
itemSorceList.add(score);
resultMap.put(id, itemSorceList);
}
String resultString =
resultMap.entrySet().stream()
.filter(item -> (item.getValue().size() >= 3))
.sorted(
(item1, item2) -> {
// 分数的最高三组数据的和
int sum1 =
item1.getValue().stream()
.sorted(Comparator.reverseOrder())
.limit(3)
.mapToInt(Integer::valueOf)
.sum();
int sum2 =
item2.getValue().stream()
.sorted(Comparator.reverseOrder())
.limit(3)
.mapToInt(Integer::valueOf)
.sum();
// 排序方式:优先按照 总和 大小降序排序,若相同则按照 id 大小降序排序
if (sum1 == sum2) {
return item2.getKey() - item1.getKey();
} else {
return sum2 - sum1;
}
})
.map(Map.Entry::getKey)
.map(String::valueOf)
.collect(Collectors.joining(","));
System.out.println(resultString);
}
}
代码解释
ChatGPT:
这段代码实现了一个射击比赛结果的统计功能。具体来说,它接收多个选手的ID和分数,并计算每个选手最高的三次得分之和,然后按照总得分排序,最终输出选手ID的排名。代码使用了Java 8的流(Stream)API来处理数据,并结合集合和排序实现功能。
代码结构与功能
-
导入必要的包:
import java.util.*;:导入Java中常用的工具包。import java.util.stream.Collectors;:导入流式操作所需的Collectors工具。
-
主类和主方法:
public class StatisticsOfShootingCompetitionResults:定义了主类。public static void main(String[] args):程序的入口点,负责读取输入和处理逻辑。
-
读取输入:
-
通过
Scanner读取用户输入,用户输入内容包括:
- 总射击次数
n。 - 每次射击的选手ID列表(用英文逗号分割)。
- 每次射击的选手分数列表(用英文逗号分割)。
- 总射击次数
-
将输入的ID和分数分别存入
idList和sorceList中,使用流API将输入字符串拆分并转换为List<Integer>。
-
-
构建选手得分的映射表:
- 使用
Map<Integer, List<Integer>> resultMap = new HashMap<>();创建一个映射表,其中key是选手ID,value是选手的得分列表。 - 遍历
idList和sorceList,将每次射击的选手ID和对应的得分存入映射表中。如果该选手尚未有得分记录,初始化一个新的LinkedList。
- 使用
-
计算和排序:
-
使用流(Stream)操作,对每个选手的得分记录进行筛选、排序和处理:
-
首先过滤出至少有3次射击记录的选手。
-
然后根据选手的最高三次得分之和排序。排序的优先级为:
- 总得分高的排在前面。
- 如果总得分相同,则按选手ID从大到小排序。
-
-
-
输出结果:
- 通过流式操作将最终的选手ID收集成一个逗号分隔的字符串,并打印结果。
以上就是本文相关的所有内容了,如果发现有误欢迎评论指正,更多内容欢迎各位关注。
上图是由 Pic 生成的
关键词:Cyber style cats
更多内容欢迎关注我(持续更新中,欢迎Star✨)
Github:CodeZeng1998/Java-Developer-Work-Note
技术公众号:CodeZeng1998(纯纯技术文)
生活公众号:好锅(Life is more than code)
其他平台:CodeZeng1998、好锅