华为OD机试 - 学生排名(Java 2024 E卷 100分)
华为OD机试 2024E卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
小明来到某学校当老师,需要将学生按考试总分或单科分数进行排名,你能帮帮他吗?
二、输入描述
第1行输入两个整数,学生人数n和科目数量m。0<n<100,0<m<10
第2行输入m个科目名称,彼此之间用空格隔开。科目名称只由英文字母构成,单个长度不超过10个字符。科目的出现顺序和后续输入的学生成绩一一对应。不会出现重复的科目名称。
第3行开始的n行,每行包含一个学生的姓名和该生m个科目的成绩(空格隔开),学生不会重名。学生姓名只由英文字母构成,长度不超过10个字符。成绩是0~100的整数,依次对应第2行中输入的科目。
第n+2行,输入用作排名的科目名称。若科目不存在,则按总分进行排序。
三、输出描述
输出一行,按成绩排序后的学生名字,空格隔开。成绩相同的按照学生姓名字典顺序排序。
1、输入
3 2
yuwen shuxue
fangfang 95 90
xiaohua 88 95
minmin 100 82
shuxue
2、输出
xiaohua fangfang minmin
3、说明
按shuxue成绩排名,依次是xiaohua、fangfang、minmin
四、解题思路
给定学生人数和科目数量,以及每个学生的姓名、各科成绩。要求按照指定科目或总分对学生进行排名,并输出排名结果。
解题思路:
- 解析输入,读取学生人数、科目数量、科目名称和学生成绩。
- 根据输入的科目名称或总分对学生进行排序。
- 输出排序后的学生名单,如果成绩相同,则按照学生姓名的字典顺序排序。
五、Java算法源码
public class OdTest01 {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(" "); // 科目名称数组Map<String, Integer> subjectIndexMap = new HashMap<>(); // 科目名称到索引的映射for (int i = 0; i < m; i++) {subjectIndexMap.put(subjects[i], i);}List<Student> students = new ArrayList<>();for (int i = 0; i < n; i++) {String[] studentInfo = scanner.nextLine().split(" ");String name = studentInfo[0];Map<String, Integer> scores = new HashMap<>();for (int j = 0; j < m; j++) {scores.put(subjects[j], Integer.parseInt(studentInfo[j + 1]));}students.add(new Student(name, scores));}String sortBySubject = scanner.nextLine(); // 排序依据的科目名称// 根据排序依据对学生进行排序students.sort((s1, s2) -> {int score1, score2;if (subjectIndexMap.containsKey(sortBySubject)) {score1 = s1.scores.getOrDefault(sortBySubject, 0);score2 = s2.scores.getOrDefault(sortBySubject, 0);} else {score1 = s1.getTotalScore();score2 = s2.getTotalScore();}if (score1 != score2) {return Integer.compare(score2, score1); // 按成绩降序排序} else {return s1.getName().compareTo(s2.getName()); // 成绩相同按姓名字典顺序排序}});// 输出排序后的学生名单for (Student student : students) {System.out.print(student.getName() + " ");}}
}class Student {String name;Map<String, Integer> scores;public Student(String name, Map<String, Integer> scores) {this.name = name;this.scores = scores;}public String getName() {return name;}public int getTotalScore() {int total = 0;for (int score : scores.values()) {total += score;}return total;}
}
六、效果展示
1、输入
3 2
yuwen shuxue
fangfang 95 90
xiaohua 88 95
minmin 90 95
zongfen
2、输出
fangfang minmin xiaohua
3、说明
排序科目不存在,按总分排序,fangfang和minmin总分相同,按姓名的字典顺序,fangfang排在前面。
🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 E卷 200分)
🏆本文收录于,华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。