华为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));
		}
	}
	
	
}
相关推荐
故事和你9114 分钟前
洛谷-算法2-1-前缀和、差分与离散化1
开发语言·数据结构·c++·算法·深度优先·动态规划·图论
知识浅谈7 小时前
DeepSeek V4 和 GPT-5.5 在同一天发布了??我也很懵,但对比完我悟了
算法
DeepModel7 小时前
通俗易懂讲透 Q-Learning:从零学会强化学习核心算法
人工智能·学习·算法·机器学习
田梓燊7 小时前
力扣:19.删除链表的倒数第 N 个结点
算法·leetcode·链表
简简单单做算法9 小时前
基于GA遗传优化双BP神经网络的时间序列预测算法matlab仿真
神经网络·算法·matlab·时间序列预测·双bp神经网络
阿豪学编程9 小时前
面试题map/unordered相关
数据结构
guygg889 小时前
利用遗传算法解决列车优化运行问题的MATLAB实现
开发语言·算法·matlab
武藤一雄9 小时前
19个核心算法(C#版)
数据结构·windows·算法·c#·排序算法·.net·.netcore
sali-tec9 小时前
C# 基于OpenCv的视觉工作流-章52-交点查找
图像处理·人工智能·opencv·算法·计算机视觉
梦想的颜色10 小时前
mongoTemplate + Java 增删改查基础介绍
数据结构·数据库·mysql