华为OD机试真题---智能成绩表
题目描述
小明来到某学校当老师,需要将学生按考试总分或单科分数进行排名。输入包括学生人数、科目数量、科目名称、每个学生的姓名和对应科目的成绩,最后输入一个用作排名的科目名称。如果输入的排名科目不存在,则按总分进行排序。输出一行,按成绩排序后的学生名字,名字之间用空格隔开。成绩相同的按照学生姓名字典顺序排序。
输入描述
- 第1行输入两个整数,分别表示学生人数n和科目数量m。
- 第2行输入m个科目名称,彼此之间用空格隔开。
- 接下来的n行,每行包含一个学生的姓名和该生m个科目的成绩(空格隔开)。
- 第n+2行,输入用作排名的科目名称。
输出描述
输出一行,按成绩排序后的学生名字,名字之间用空格隔开。
示例
示例1:
- 输入:
3 2
yuwen shuxue
fangfang 95 90
xiaohua 88 95
minmin 100 82
shuxue
- 输出:
xiaohua fangfang minmin
说明:按shuxue成绩排名,依次是xiaohua、fangfang、minmin。
示例2:
- 输入:
3 2
yuwen shuxue
fangfang 95 90
xiaohua 88 95
minmin 90 95
zongfen
- 输出:
fangfang minmin xiaohua
说明:排序科目不存在,按总分排序,fangfang和minmin总分相同,按姓名的字典顺序,fangfang排在前面。
解题思路
- 读取输入:首先读取学生人数、科目数量、科目名称、每个学生的姓名和对应科目的成绩,以及用作排名的科目名称。
- 处理数据:
- 创建一个学生数据结构(如结构体或类),包含学生姓名、各科成绩和总分。
- 读取数据时,计算每个学生的总分,并存储在相应的数据结构中。
- 确定排序规则:
- 检查用作排名的科目名称是否存在于输入的科目列表中。
- 如果存在,则按该科目成绩进行排序;如果不存在,则按总分进行排序。
- 排序:使用合适的排序算法(如快速排序、归并排序等)对学生数组进行排序。如果成绩相同,则按姓名的字典顺序排序。
- 输出:按排序后的顺序输出学生的名字。
注意事项
- 在处理输入时,要注意数据的有效性和边界情况,如输入数据的格式是否正确、是否有非法字符等。
- 在计算总分和排序时,要注意整数溢出的问题。
- 在编写代码时,要注意代码的健壮性和可读性,尽量使用简洁明了的代码结构。
代码实现
import lombok.Data;
import lombok.Getter;import java.io.Serializable;@Data
public class Student implements Serializable {// 获取学生姓名的方法@Getterprivate String name;private int[] scores;// 假设有一个构造函数来初始化这些字段public Student(String name, int[] scores) {this.name = name;this.scores = scores;}// 获取科目成绩的方法public int getScores(int index) {return scores[index];}// 如果需要,可以添加计算总分的方法public int getTotalScore() {int total = 0;for (int score : scores) {total += score;}return total;}public Student getStudent() {return new Student(name, scores);}
}
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;public class SmartGradeSheet {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt(); // 学生人数int m = scanner.nextInt(); // 科目数量scanner.nextLine(); // 跳过行尾String[] subjects = scanner.nextLine().split("\\s+"); // 读取科目名称List<Student> students = new ArrayList<>();for (int i = 0; i < n; i++) {String[] inputs = scanner.nextLine().split("\\s+");String name = inputs[0];int[] scores = new int[m];for (int j = 1; j <= m; j++) {scores[j - 1] = Integer.parseInt(inputs[j]);}students.add(new Student(name, scores));}String rankingSubject = scanner.nextLine(); // 读取用作排名的科目名称Comparator<Student> comparator = null;if (contains(subjects, rankingSubject)) {// 按指定科目成绩排序int subjectIndex = getIndex(subjects, rankingSubject);comparator = Comparator.comparingInt( (**Student student**) -> student.getScores(subjectIndex)).thenComparing(Student::getName, Comparator.naturalOrder());} else {// 按总分排序comparator = Comparator.comparingInt(Student::getTotalScore).thenComparing(Student::getName);}students.sort(comparator);// 输出结果for (int i = 0; i < students.size(); i++) {if (i > 0) System.out.print(" ");System.out.print(students.get(i).getName());}System.out.println();scanner.close();}// 辅助方法:检查科目名称是否存在于数组中private static boolean contains(String[] array, String target) {for (String item : array) {if (item.equals(target)) {return true;}}return false;}// 辅助方法:获取科目名称在数组中的索引private static int getIndex(String[] array, String target) {for (int i = 0; i < array.length; i++) {if (array[i].equals(target)) {return i;}}throw new IllegalArgumentException("Subject not found: " + target);}// 注意:这里需要给Student类添加getTotalScore()方法,但为了简洁,我直接在构造函数中计算了总分// 如果需要,可以添加如下方法到Student类中// public int getTotalScore() {// return totalScore;// }}
记一下写代码过程中提示的报错:
最先:
comparator = Comparator.comparingInt( student -> student.getScores(subjectIndex))
SmartGradeSheet.java:41:68 java: 找不到符号 符号: 方法 getScores(int) 位置: 类型为java.lang.Object的变量 student。 网上查了说这种是因为 Student类缺少了getScores(int subjectIndex)方法,但实际是有的。 继续排查说:Comparator 中的 student 被隐式地当作 java.lang.Object 类型处理,而不是 Student 类型,但实际早就定义为了Comparator<Student>,所以问题不在这里。 最后发现: 应该使用 (Student student) -> student.getScores(subjectIndex) 明确指定 student 的类型为 Student
为什么要这样使用呢?
在 Java 中,Lambda 表达式的参数类型可以通过类型推断来确定。然而,在某些情况下,类型推断可能会出现问题,导致编译器无法正确识别参数类型。以下是一些具体的原因和解释:
- 类型推断问题
当编译器无法准确推断 Lambda 参数的类型时,需要显式指定类型。例如,在以下情况下,编译器可能无法正确推断类型:
Comparator comparator = (student) -> student.getScores(subjectIndex);
如果编译器无法从上下文中推断出 student 的类型,就会将其视为 Object 类型,从而导致找不到 getScores 方法。 - 显式类型声明提高代码可读性和可维护性
显式指定类型可以提高代码的可读性和可维护性。例如:
Comparator comparator = (Student student) -> student.getScores(subjectIndex);
相关文章:
华为OD机试真题---智能成绩表
题目描述 小明来到某学校当老师,需要将学生按考试总分或单科分数进行排名。输入包括学生人数、科目数量、科目名称、每个学生的姓名和对应科目的成绩,最后输入一个用作排名的科目名称。如果输入的排名科目不存在,则按总分进行排序。输出一行…...
828华为云征文 | 华为云Flexus云服务器X实例搭建企业内部VPN私有隧道,以实现安全远程办公
VPN虚拟专用网络适用于企业内部人员流动频繁和远程办公的情况,出差员工或在家办公的员工利用当地ISP就可以和企业的VPN网关建立私有的隧道连接。 通过拨入当地的ISP进入Internet再连接企业的VPN网关,在用户和VPN网关之间建立一个安全的“隧道”ÿ…...
Hadoop集群的高可用(HA):NameNode和resourcemanager高可用的搭建
文章目录 一、NameNode高可用的搭建1、免密配置2、三个节点都需要安装psmisc3、检查三个节点是否都安装jdk以及zk4、检查是否安装了hadoop集群5、修改hadoop-env.sh6、修改core-site.xml7、修改hdfs-site.xml8、检查workers 文件是否为三台服务9、分发给其他两个节点10、初始化…...
支付宝沙箱环境 支付
一 什么是沙箱: 沙箱环境是支付宝开放平台为开发者提供的安全低门槛的测试环境 支付宝正式和沙箱环境的区别 : AI: 从沙箱到正式环境: 当应用程序开发完成后,需要将应用程序从沙箱环境迁移到正式环境。 这通常涉及…...
获取unity中prefab的中文文本内容以及和prefab有关的问题
背景1:经常会在开发中遇到策划需要改某个界面,但是我们不知道那是什么界面,只看到一些关键字比如圣诞活动,那这样我就可以轻易找到这个预设了。另外还可以扩展就是收集项目中的所有中文文本然后归集到多语言表中,然后接…...
Web自动化中常用XPath定位方式
在进行Web自动化测试时,元素定位是一个至关重要的环节。XPath(XML Path Language)是一种用于在XML文档中定位节点的语言。在Web自动化中,XPath广泛应用于定位HTML元素。本文将详细介绍几种常用的XPath定位方式,包括绝对…...
Unity3D播放GIF图片使用Animation来制作动画
系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、下载GIF动图,用PS制作导出帧动画图片👉二、使用Animation制作动画👉三、脚本控制动画播放👉壁纸分享👉总结👉前言 unity播放gif图片,本身是不支持的,但是可以使用其他方法来实现, 1.有一种使用System…...
redo log 和 bin log 的两阶段提交
两阶段提交的过程 当事务提交后,有一个两阶段提交策略。 在开启两阶段提交时,会开启一个 XA 事务(宏观上的事务), Prepare 阶段:将 redo log 的状态设置为 prepare,然后将 事务XID 写入 redo…...
Go基础学习07-map注意事项;多协程对map的资源竞争;sync.Mutex避免竟态条件
文章目录 Go中map使用以及注意事项map使用时的并发安全问题 Go中map使用以及注意事项 Go语言中map使用简单示例: func main() {var mp map[string]int// mp : map[string]int{}val, ok : mp["one"]if ok {fmt.Println(val)} else {fmt.Println(val)}mp[…...
远程服务器安装anaconda并创建虚拟环境
1、承接上文新用户zrcs,在服务器的zrcs文件夹下直接下载anaconda(很慢): wget https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-x86_64.sh 或者选择本地下载,清华大学开源软件镜像站:https:/…...
什么是IIC通信协议?
IIC(Inter-Integrated Circuit)通信协议,又称为I2C(Inter-Integrated Circuit 2)协议,是一种广泛使用的串行通信协议。它由飞利浦半导体公司(现NXP Semiconductors)开发,…...
P3131 [USACO16JAN] Subsequences Summing to Sevens S Python题解
[USACO16JAN] Subsequences Summing to Sevens S 题目描述 Farmer John’s N N N cows are standing in a row, as they have a tendency to do from time to time. Each cow is labeled with a distinct integer ID number so FJ can tell them apart. FJ would like to ta…...
鸿蒙NEXT开发-ArkUI(基于最新api12稳定版)
注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…...
Matplotlib 使用 LaTeX 渲染图表中的文本、标题和数学公式
Matplotlib 使用 LaTeX 渲染图表中的文本、标题和数学公式 Matplotlib 是一个功能强大的 Python 库,用于绘制各种高质量的图表和图形。在许多科研和技术文档中,数学公式是不可或缺的一部分,LaTeX 提供了精美的数学公式渲染能力。Matplotlib …...
Android 安卓内存安全漏洞数量大幅下降的原因
谷歌决定使用内存安全的编程语言 Rust 向 Android 代码库中写入新代码,尽管旧代码(用 C/C 编写)没有被重写,但内存安全漏洞却大幅减少。 Android 代码库中每年发现的内存安全漏洞数量(来源:谷歌)…...
c++primier第十二章类和动态内存
本章内容包括: 对类成员使用动态内存分配隐式和显式地复制构造函数隐式和显式地重载赋值操作符在构造函数中使用new所必须完成的工作使用静态类成员 将布局new操作符用于对象使用指向对象的指针实现队列抽象数据类型(ADT) 动态内存和类 复习范例和静态类成员 首…...
Ansible学习之ansible-pull命令
想要知道ansible-pull是用来做什么的,就需要了解Ansible的工作模,Ansible的工作模式有两种: push模式 push推送,这是Ansible的默认模式,在主控机上编排好playbook文件,push到远程主机上来执行。pull模式 p…...
Linux:磁盘管理
一、静态分区管理 静态的分区方法不可以动态的增加或减少分区的容量。 1、磁盘分区-fdisk 该命令是用于查看磁盘分区情况,和分区管理的命令 命令格式:fdisk [选项] 设备文件名常用命令: -h:查看分区信息 fdisk系统常用命令&…...
FP7209: 用于紫外线消毒灯的 升压LED恒流驱动芯片
现在社会对于居家消毒也越发重视起来。而居家消毒除了75%浓度酒精及各类消毒液外,利用紫外线灯给衣物表面、房间消毒也是一种很好的选择。FP7209 定位于低压线性恒流驱动,精度高、外围电路简单、使用方便且可靠性高,更可广泛应用于商业照明系…...
【华为HCIP实战课程二】OSPF基础介绍和OSPF RID NBMA配置详解
一、OSPF多区域 自治系统(Autonomous System) 一个自治系统是指使用同一种路由协议交换路由信息的一组路由器 1、Area0为骨干区域 2、ABR--关乎3类LSA后续详解 ABR用来连接骨干区域Area0和非骨干区域,它与骨干区域之间既可以是物理连接,也可以是逻辑上的连接。 3、AS…...
从帧结构到数据解析:深入理解CJ/T 188 MBUS水表通信协议
1. MBUS协议与水表通信基础 第一次接触CJ/T 188 MBUS协议时,我完全被那一串串十六进制报文搞懵了。FE FE FE 68开头的报文到底在说什么?为什么水表厂商给的文档读起来像天书?经过几个项目的实战,我发现只要掌握几个关键点…...
终极Windows激活解决方案:3分钟永久激活Windows和Office的完整指南
终极Windows激活解决方案:3分钟永久激活Windows和Office的完整指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 你是否曾经遇到过这样的场景:新安装的Windows系统弹出…...
如何为iOS 14.0-16.6.1设备安装TrollStore:TrollInstallerX完整指南
如何为iOS 14.0-16.6.1设备安装TrollStore:TrollInstallerX完整指南 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 如果你正在寻找一种可靠且简单的方法在i…...
Typora“激活”与“美化”实战指南
1. Typora基础认知与安装准备 Typora作为一款广受好评的Markdown编辑器,其独特之处在于将编辑与预览合二为一。不同于传统Markdown编辑器需要分屏显示源代码和渲染效果,Typora实现了真正的所见即所得——你在编辑区输入的Markdown语法会实时转换为排版效…...
【20年架构老兵亲授】:SITS 2026服务边界定义三原则、8类AI上下文耦合陷阱及动态治理沙盒实测数据
更多请点击: https://intelliparadigm.com 第一章:AI原生微服务架构:SITS 2026服务拆分与治理策略 AI原生微服务并非传统微服务的简单升级,而是以模型生命周期、推理上下文感知和实时反馈闭环为驱动的服务边界重构。SITS 2026&am…...
zclean:开发者必备的自动化磁盘清理工具,释放宝贵存储空间
1. 项目概述与核心价值最近在整理自己的开发环境时,又遇到了那个老生常谈的问题:系统用久了,各种临时文件、缓存、残留的依赖包,把磁盘空间一点点蚕食殆尽。特别是对于开发者而言,项目依赖、构建产物、Docker镜像、各种…...
别再死记硬背了!用GNS3/EVE-NG模拟BGP、OSPF、RIP混合组网,带你理解路由选路优先级
动态路由协议实战:用GNS3/EVE-NG解密BGP、OSPF、RIP选路逻辑 当你面对一个同时运行BGP、OSPF和RIP的复杂网络时,路由器究竟如何选择最佳路径?这个看似基础的问题,却让无数网络工程师在深夜排障时抓狂。传统教材中那些枯燥的AD值表…...
深入u-boot目录结构:以全志V3s的LicheePi Zero为例,理解每个文件夹的作用
深入解析u-boot目录结构:全志V3s平台下的LicheePi Zero实践指南 当你第一次打开u-boot源码仓库时,面对密密麻麻的目录结构可能会感到无从下手。作为嵌入式系统开发中至关重要的启动加载程序,u-boot的架构设计既体现了通用性又兼顾了平台特异…...
5分钟快速上手:XUnity.AutoTranslator游戏实时翻译插件终极指南
5分钟快速上手:XUnity.AutoTranslator游戏实时翻译插件终极指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为语言障碍而无法畅玩海外Unity游戏吗?XUnity.AutoTranslator正…...
Gemini 辅助做创意写作:故事大纲、角色设定、世界观构建的 AI 协作
很多作者在创作卡壳时,其实不是“没有灵感”,而是缺一套可迭代的设计流程:大纲松散、角色像说明书、世界观看似宏大却前后不一致。2026 年的写作新趋势,是把 Gemini 当作“创作协作伙伴”而不是“代写引擎”,让它参与结…...
