华为机试-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来处理数据,并结合集合和排序实现功能。

代码结构与功能

  1. 导入必要的包

    • import java.util.*;:导入Java中常用的工具包。
    • import java.util.stream.Collectors;:导入流式操作所需的Collectors工具。
  2. 主类和主方法

    • public class StatisticsOfShootingCompetitionResults:定义了主类。
    • public static void main(String[] args):程序的入口点,负责读取输入和处理逻辑。
  3. 读取输入

    • 通过

      Scanner
      

      读取用户输入,用户输入内容包括:

      • 总射击次数n
      • 每次射击的选手ID列表(用英文逗号分割)。
      • 每次射击的选手分数列表(用英文逗号分割)。
    • 将输入的ID和分数分别存入idListsorceList中,使用流API将输入字符串拆分并转换为List<Integer>

  4. 构建选手得分的映射表

    • 使用Map<Integer, List<Integer>> resultMap = new HashMap<>();创建一个映射表,其中key是选手ID,value是选手的得分列表。
    • 遍历idListsorceList,将每次射击的选手ID和对应的得分存入映射表中。如果该选手尚未有得分记录,初始化一个新的LinkedList
  5. 计算和排序

    • 使用流(Stream)操作,对每个选手的得分记录进行筛选、排序和处理:
      • 首先过滤出至少有3次射击记录的选手。
      • 然后根据选手的最高三次得分之和排序。排序的优先级为:
        1. 总得分高的排在前面。
        2. 如果总得分相同,则按选手ID从大到小排序。
  6. 输出结果

    • 通过流式操作将最终的选手ID收集成一个逗号分隔的字符串,并打印结果。

以上就是本文相关的所有内容了,如果发现有误欢迎评论指正,更多内容欢迎各位关注。
在这里插入图片描述

上图是由 Pic 生成的

关键词:Cyber style cats


更多内容欢迎关注我(持续更新中,欢迎Star✨)

Github:CodeZeng1998/Java-Developer-Work-Note

技术公众号:CodeZeng1998(纯纯技术文)

生活公众号:好锅(Life is more than code)

其他平台:CodeZeng1998好锅

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值