华为OD E卷(100分)16-智能成绩表

前言

工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力,无聊之余打算用一些大厂的编程题练练手。希望通过这些分享能够帮到一些人,也希望能和看到此文的大神们沟通交流,提升自己,更希望在此期间能够找到一份理想的工作。

题目描述

K小姐是一位教师,她需要一个学生成绩管理系统来帮助她对学生的考试成绩进行排名。系统需要支持按照总分或者单科成绩进行排序。你能帮帮她吗?

输入

  1. 第一行包含两个正整数 n 和 m,分别表示学生人数和科目数量。(0<n<100, 0<m<10)
  2. 第二行包含 m 个由空格隔开的科目名称。科目名称只由英文字母构成,单个长度不超过 10个字符。
  3. 科目的出现顺序和后续输入的学生成绩一一对应,不会出现重复的科目名称。
  4. 接下来的n 行,每行包含一个学生的姓名和该生 m 个科目的成绩(空格隔开)。学生姓名只由英文字母构成,长度不超过 10 个字符。
  5. 成绩是 0 到 100 的整数,依次对应第二行输入的科目。
  6. 最后一行输入一个字符串,表示用作排名的科目名称。若该科目不存在,则按总分进行排序。

输出

输出一行,表示按成绩排序后的学生姓名,用空格隔开。如果有成绩相同的情况,则按照学生姓名的字典序进行排序。

示例

输入

3 2

yuwen shuxue

fangfang 95 90

xiaohua 88 98

minmin 100 82

shuxue

输出

xiaohua fangfang minmin

解题思路

  1. 使用TreeMap存储某一科的成绩,key为成绩,Value为 学生姓名的集合,这样就能默认按成绩的正序进行自动排序。
  2. 上述的Value 使用TreeSet 集合, 这样就能默认按字符串正序自动进行排序。

题解

Java实现

java 复制代码
package huawei.e100;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.TreeMap;
import java.util.TreeSet;

/**
* @author arnold
* @date 2024年12月11日
* 
*/
public class T16 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()) {
			int studentNum = sc.nextInt();
			int typeNum = sc.nextInt();
			sc.nextLine();
			String[] types = sc.nextLine().split(" ");
			
			// 生成各科成绩表
			List<TreeMap<Integer, TreeSet<String>>> list = new ArrayList<>();
			for(int j=0 ; j< typeNum; j++) {
				TreeMap<Integer, TreeSet<String>> classScores = new TreeMap<>();
				list.add(classScores);
			}
			// 最后一个记录总分
			TreeMap<Integer, TreeSet<String>> classScores = new TreeMap<>();
			list.add(classScores);
			
			for (int i = 0; i < studentNum; i++) {
				String[] tmp = sc.nextLine().split(" ");
				String name = tmp[0];
				int sum = 0;
				// 按科目顺序录入成绩进各个科目的排名集合
				for(int j=0 ; j< typeNum; j++) {
					int score = Integer.parseInt(tmp[j+1]);
					if (list.get(j).containsKey(score)) {
						list.get(j).get(score).add(name);
					} else {
						TreeSet<String> set = new TreeSet<String>();
						set.add(name);
						list.get(j).put(score, set);
					}
					sum += score;
					
				}
				if (list.get(list.size()-1).containsKey(sum)) {
					list.get(list.size()-1).get(sum).add(name);
				} else {
					TreeSet<String> set = new TreeSet<String>();
					set.add(name);
					list.get(list.size()-1).put(sum, set);
				}
			}
			// 取待排序科目
			String orderByType = sc.nextLine();
			// 获取待排名科目成绩数据,没有的话就取总成绩的数据
			TreeMap<Integer, TreeSet<String>> sortClass = null;
			for (int i = 0; i < types.length; i++) {
				if(types[i].equals(orderByType)) {
					sortClass = list.get(i);
				}
			}
			// 没有的话就取总成绩的数据
			if (sortClass == null) {
				sortClass = list.get(list.size()-1);
			}
			// 创建排名结果集合
			List<String> sortNames = new ArrayList<>();
			// 倒序取Key
			for(int key: sortClass.descendingKeySet()) {
				sortClass.get(key).forEach(name-> sortNames.add(name));
			}
			System.out.println(String.join(" ", sortNames));
		}
	}
	
	
}
相关推荐
菜鸟555553 分钟前
图论:Floyd算法
算法·图论
呼啦啦啦啦啦啦啦啦5 小时前
常见的排序算法
java·算法·排序算法
胡萝卜3.06 小时前
数据结构初阶:排序算法(一)插入排序、选择排序
数据结构·笔记·学习·算法·排序算法·学习方法
地平线开发者6 小时前
LLM 中 token 简介与 bert 实操解读
算法·自动驾驶
lyx33136967596 小时前
Pandas数据结构详解Series与DataFrame
数据结构·pandas
scx201310046 小时前
20250814 最小生成树和重构树总结
c++·算法·最小生成树·重构树
阿巴~阿巴~6 小时前
冒泡排序算法
c语言·开发语言·算法·排序算法
散1127 小时前
01数据结构-交换排序
数据结构·算法
yzx9910137 小时前
Yolov模型的演变
人工智能·算法·yolo
weixin_307779138 小时前
VS Code配置MinGW64编译SQLite3库
开发语言·数据库·c++·vscode·算法