华为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…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
