华为OD机试 - N个选手比赛前三名、比赛(Java 2024 E卷 100分)

news2024/9/23 8:33:06

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)》。

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

一个有N个选手参加的比赛,选手编号为1~N(3 <= N <= 100),有M(3 <= M <= 10)个评委对选手进行打分。

打分规则为每个评委对选手打分,最高为10分,最低为1分。

请计算得分最多的3位选手的编号。

如果得分相同,得分高分值最多的选手排名靠前。

(10分数量相同,则比较9分的数量,以此类推,用例中不会出现多个选手得分完全相同的情况。)

二、输入描述

第一行为半角逗号分割的两个正整数,第一个数字表示M(3 <= M <= 10)个评委,第二个数字表示N(3 <= N <= 100)个选手。

第2到M+1行为半角逗号分割的整数数组,表示评委对每个选手的打分,0号下标数字表示1号选手分数,1号下标数字表示2号选手分数,依次类推。

三、输出描述

选手前3名的编号。

注意:

若输入为异常,输出-1,如M、N、打分不在生范围内。

四、测试用例

测试用例1:

1、输入

4,5
10,6,9,7,6
9,10,6,7,5
8,10,6,5,10
9,10,8,4,9

2、输出

2,1,5

3、说明

第一行代表有4个评委,5个选手参加比赛 矩阵代表是4*5,每个数字是选手的编号,每一行代表一个评委对选手的打分排序, 2号选手得分36分排第1,1号选手36分排第2,5号选手30分(2号10分值有3个,1号10分值只有1个,所以2号排第一)

测试用例2:

1、输入

2,5
7,3,5,4,2
8,5,4,4,3

2、输出

-1

3、说明

只有2个评委,要求最少为3个评委

五、解题思路

  1. 遍历每个评委的打分,将每个选手的分数累加到 totalScore 中,并更新相应的 scoreCounts。
  2. 总得分从高到低。
  3. 若总得分相同,比较10分的数量,数量多的排名靠前;若10分数量相同,比较9分的数量,以此类推。
  4. 取排序后的前3个选手的 id,用逗号分隔输出。
  5. 如果输入不满足题目要求的格式或范围,直接输出 -1。

六、Java算法源码

public class OdTest01 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        try {
            // 读取第一行并解析M和N
            if (!scanner.hasNextLine()) {
                System.out.println("-1");
                return;
            }
            String firstLine = scanner.nextLine().trim();
            String[] mn = firstLine.split(",");
            if (mn.length != 2) { // 确保有两个数字
                System.out.println("-1");
                return;
            }
            int M = Integer.parseInt(mn[0].trim());
            int N = Integer.parseInt(mn[1].trim());

            // 验证M和N的范围
            if (M < 3 || M > 10 || N < 3 || N > 100) {
                System.out.println("-1");
                return;
            }

            // 初始化选手列表
            List<Contestant> contestants = new ArrayList<>();
            for (int i = 1; i <= N; i++) {
                contestants.add(new Contestant(i));
            }

            // 读取M行打分
            for (int i = 0; i < M; i++) {
                if (!scanner.hasNextLine()) { // 如果打分行不足M行
                    System.out.println("-1");
                    return;
                }
                String scoreLine = scanner.nextLine().trim();
                String[] scoresStr = scoreLine.split(",");
                if (scoresStr.length != N) { // 每行必须有N个分数
                    System.out.println("-1");
                    return;
                }
                for (int j = 0; j < N; j++) {
                    int score = Integer.parseInt(scoresStr[j].trim());
                    // 验证分数范围
                    if (score < 1 || score > 10) {
                        System.out.println("-1");
                        return;
                    }
                    contestants.get(j).addScore(score); // 为对应选手添加分数
                }
            }

            // 确保没有多余的打分行
            // 可以选择忽略,或进一步验证,视具体需求

            // 排序选手
            Collections.sort(contestants, new Comparator<Contestant>() {
                @Override
                public int compare(Contestant c1, Contestant c2) {
                    if (c2.totalScore != c1.totalScore) {
                        return c2.totalScore - c1.totalScore; // 总得分降序
                    }
                    // 如果总得分相同,比较分数分布
                    for (int i = 0; i < 10; i++) { // 从10分到1分
                        if (c2.scoreCounts[i] != c1.scoreCounts[i]) {
                            return c2.scoreCounts[i] - c1.scoreCounts[i]; // 分数数量降序
                        }
                    }
                    return 0; // 如果完全相同,保持原有顺序(题目保证不会有完全相同的情况)
                }
            });

            // 取前3名
            List<Integer> top3 = new ArrayList<>();
            for (int i = 0; i < 3; i++) {
                top3.add(contestants.get(i).id);
            }

            // 输出结果,用逗号分隔
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < top3.size(); i++) {
                sb.append(top3.get(i));
                if (i != top3.size() - 1) {
                    sb.append(",");
                }
            }
            System.out.println(sb.toString());

        } catch (Exception e) {
            // 捕获任何异常,输出-1
            System.out.println("-1");
        } finally {
            scanner.close(); // 关闭扫描器
        }
    }
}

// 定义选手类,包含编号、总得分和分数分布
class Contestant {
    int id; // 选手编号
    int totalScore; // 总得分
    int[] scoreCounts; // 分数分布,scoreCounts[0]表示10分的数量,scoreCounts[9]表示1分的数量

    public Contestant(int id) {
        this.id = id;
        this.totalScore = 0;
        this.scoreCounts = new int[10]; // 初始化分数分布数组
    }

    // 方法:添加一个分数
    public void addScore(int score) {
        this.totalScore += score; // 累加总得分
        if (score >=1 && score <=10) {
            this.scoreCounts[10 - score] += 1; // 更新对应分数的数量
        }
    }
}

七、效果展示

1、输入

4,2
8,5
5,6
10,4
8,9

2、输出

-1

3、说明

只有2个评委,要求最少为3个评委


🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 E卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2157085.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【STM32】TIM定时器定时中断与定时器外部时钟的使用

TIM定时器定时中断与定时器外部时钟的使用 一、TIM定时器简介1、TIM&#xff08;Timer&#xff09;定时器2、定时器类型3、高级定时器4、通用定时器5、基本定时器6、定时中断基本结构代码编写&#xff1a;定时中断/外部时钟定时中断 7、预分频器时序8、计数器时序9、计数器无预…

手写SpringMVC

1、开发HspDispatcherServlet 2、完成客户端/浏览器可以请求控制层 目的&#xff1a;发出url请求时&#xff0c;经过前端控制器&#xff0c;找到Monster的List方法&#xff0c;把结果再打回去 3、从web.xml动态获取hspspringmvc.xml 4、完成自定义Service注解功能 目的&…

【功能详解】IoTDB 与 ThingsBoard 成功集成!

可视化工具集成1 IoTDB 实现了 ThingsBoard 的无缝集成对接&#xff0c;IoTDB 构建的工业数据存储处理-可视化呈现链路又多了一种可用、易用的工具选择。 我们的代码已贡献到 ThingsBoard 社区&#xff08;待发版&#xff09;&#xff0c;用户手册也已发布&#xff08;可点击下…

HBASE_题库详解

1、 HBase的特点是什么&#xff1f; 1&#xff09;大&#xff1a;一个表可以有数十亿行&#xff0c;上百万列 2&#xff09;无模式&#xff1a;每行都有一个可排序的主键和任意多的列&#xff0c;列可以根据需要动态的增加&#xff0c;同一张表中不同的行可以有截然不同的列 3…

浪涌抑制-功率NTC选型计算

目录&#xff1a; 一、概述 二、NTC抑制浪涌原理 三、功率NTC的介绍 四、功率NTC选型原则 1、峰值正向浪涌电流 2、阻值选取 3、正常工作的计算 一、概述 NTC热敏电阻除用于温度测量(热敏电阻温度检测-分段曲线拟合、Steinhart-Hart与查表)外&#xff0c;在电源中常用于…

word如何快速打开文档中的网址超链接?

1、鼠标放在文档中超链接上&#xff1a; 2、然后左手按住【CTRL】键&#xff0c;之后鼠标光标会变成一个手形&#xff0c; 然后右手&#xff0c;点击鼠标左键&#xff0c;即可快速使用电脑当前设置的默认浏览器打开并跳转到网址&#xff1a;

三阶魔方还原法 勾上回下 上右左左右

三阶魔方还原法&#xff1a; 1小白花 &#xff08;转3换1&#xff09; 2白十字架 (侧与中心同色 下下) 3第一层 &#xff08;找位置角块放顶点 勾上回下&#xff09; 4 第二层 &#xff08;颜色边 勾上回下 再单白边 勾上回下&#xff09; 5 黄十字架 &#xff08;无黄边 压 勾…

nodejs基于vue电子产品商城销售网站的设计与实现 _bugfu

目录 技术栈具体实现截图系统设计思路技术可行性nodejs类核心代码部分展示可行性论证研究方法解决的思路Express框架介绍源码获取/联系我 技术栈 该系统将采用B/S结构模式&#xff0c;开发软件有很多种可以用&#xff0c;本次开发用到的软件是vscode&#xff0c;用到的数据库是…

告别枯燥:我开发了一个在电脑桌面上使用弹幕来背单词的软件

前言 在这个快节奏的时代&#xff0c;我们每天都在忙碌中度过&#xff0c;手机虽然方便&#xff0c;但往往难以找到一整块时间来专心背单词。然而&#xff0c;你是否意识到&#xff0c;每天坐在电脑前的时间远比使用手机的时间要长&#xff1f;现在我们来介绍一个新型的学习软…

阿里云kafka消息写入topic失败

1. 问题现象描述 20240918,14:22&#xff0c;测试反馈说kafka有问题&#xff0c;生产者写入消息的时候报错&#xff0c;并发了一张日志截图&#xff0c;主要报错如下&#xff1a; to topic xxxx: org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for x…

Linux中的环境变量及main函数参数详解

目录 Linux中的环境变量 常见环境变量 PATH : 和环境变量相关的命令 通过系统调用获取或设置环境变量 getenv putenv 新增环境变量 进程切换&#xff1a; main函数参数 命令行参数 Linux中的环境变量 环境变量(environment variables)一般是指在操作系统中用来指定操…

Leetcode 每日一题:Diameter of Binary Tree

写在前面&#xff1a; 最近被学校的 campus involvement 社团活动的招新宣传和选拔&#xff0c;以及找工作频繁的参加招聘会和网上申请忙的焦头烂额&#xff0c;马上又要到来的期中考试让我再次意识到了大学生活的险恶。虽然大家都说学生时代是最幸福的时代&#xff0c;但这个…

Python中的数据可视化:从基础图表到高级可视化

数据可视化是数据分析和科学计算中不可或缺的一部分。它通过图形化的方式呈现数据&#xff0c;使复杂的统计信息变得直观易懂。Python提供了多种强大的库来支持数据可视化&#xff0c;如Matplotlib、Seaborn、Plotly等。本文将从基础图表入手&#xff0c;逐步介绍如何使用这些库…

vue3 选择字体的颜色,使用vue3-colorpicker来选择颜色

1、有的时候我们会用到颜色的选择器&#xff0c;像element-plus提供了&#xff0c;但是ant-design-vue并没有&#xff1a; 这个暂时没有看到&#xff1a; 但是Ant Design 5的版本有&#xff0c;应该不是vue的。 2、使用第三方提供的vue3-colorpicker&#xff1a;storybook/cli…

18_Python文件操作

计算机中的文件 文件是存储在计算机上的数据集合&#xff0c;它可以是文本、图片、音频、视频或其他任何类型的数据。 在计算机系统中&#xff0c;文件通常用来长期保存信息。 文本文件&#xff1a;一种以字符编码&#xff08;如ASCII、UTF-8、UTF-16等&#xff09;的形式存储…

C++离线查询

前言 C算法与数据结构 打开打包代码的方法兼述单元测试 概念及原理 离线算法( offline algorithms)&#xff0c;离线计算就是在计算开始前已知所有输入数据&#xff0c;输入数据不会产生变化&#xff0c;且在解决一个问题后就要立即得出结果的前提下进行的计算。 通俗的说&a…

深入浅出:Eclipse 中配置 Maven 与 Spark 应用开发全指南

Spark 安装配置 1.在 Eclipse 中配置 Maven Eclipse 中默认自带 Maven 插件&#xff0c;但是自带的 Maven 插件不能修改本地仓库&#xff0c;所 以通常我们不使用自带的 Maven &#xff0c;而是使用自己安装的&#xff0c;在 Eclipse 中配置 Maven 的 步骤如下&#xff1a;…

多模态大模型应用开发技术学习

前篇提到多模态模型应用是未来的应用方向&#xff0c;本篇就聊聊技术学习方面的内容。 应用场景 多模态大模型技术的应用场景非常广泛&#xff0c;涵盖了从日常生活到专业领域的各个方面。以下是一些主要的应用场景&#xff1a; 办公自动化&#xff1a;多模态大模型可以用于…

K8s 之微服务的定义及详细资源调用案例

什么是微服务 用控制器来完成集群的工作负载&#xff0c;那么应用如何暴漏出去&#xff1f; 需要通过微服务暴漏出去后才能被访问 Service是一组提供相同服务的Pod对外开放的接口。借助Service&#xff0c;应用可以实现服务发现和负载均衡。service默认只支持4层负载均衡能力&…

指针 (七)

一 . 回调函数 什么是回调函数呢&#xff1f;就是说我们将函数的指针&#xff08;地址&#xff09;作为参数传递给另一个函数&#xff0c;当这个指针被用来调用其所指向的函数时&#xff0c;这个被调用的函数就是回调函数。回调函数并不是由该函数的实现方直接调用&#xff0c…