华为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));
		}
	}
	
	
}
相关推荐
华华哥20226 分钟前
《模型不玄学》第25章 双头模型:共享底座 + 两个分支
算法
Yfhonier16 分钟前
6441. 特别的除法
c++·算法
华华哥202220 分钟前
《模型不玄学》第5章 看懂你的数据:先认字段,再过门禁
算法
国科安芯23 分钟前
低轨卫星姿轨控系统中抗辐射MCU的选型依据与工程实践
单片机·嵌入式硬件·算法·架构·系统安全·低轨卫星·抗辐射
高亦真29 分钟前
今天是学习嵌入式的第33天
linux·学习·算法
CoderYanger30 分钟前
A.每日一题:3345. 最小可整除数位乘积 I
java·数据结构·程序人生·算法·leetcode·面试·学习方法
带多刺的玫瑰31 分钟前
Leecode#16刷题之最接近的三数之和
数据结构·算法
Yfhonier37 分钟前
岛屿数量(DFS)
算法·深度优先
橘子汽水16838 分钟前
Leetcode15:三数之和
java·数据结构·算法
黄金龙PLUS41 分钟前
ASCON置换算法的优缺点
算法·网络安全·密码学·哈希算法·同态加密