华为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));
		}
	}
	
	
}
相关推荐
沐怡旸9 分钟前
【算法】725.分割链表--通俗讲解
算法·面试
im_AMBER1 小时前
数据结构 04 栈和队列
数据结构·笔记·学习
L_09071 小时前
【Algorithm】Day-4
c++·算法·leetcode
代码充电宝2 小时前
LeetCode 算法题【简单】20. 有效的括号
java·算法·leetcode·面试·职场和发展
海琴烟Sunshine2 小时前
leetcode 119. 杨辉三角 II python
算法·leetcode·职场和发展
小杨的全栈之路2 小时前
霍夫曼编码:数据压缩的核心算法详解(附图解 + 代码)
算法
cjinhuo2 小时前
标签页、书签太多找不到?AI 分组 + 拼音模糊搜索,开源插件秒解切换难题!
前端·算法·开源
郝晨妤2 小时前
鸿蒙List组件通过拖拽改变排序
华为od·华为·harmonyos·鸿蒙
贝塔实验室2 小时前
频偏估计方法--快速傅里叶变换(FFT)估计法
网络协议·算法·数学建模·动态规划·信息与通信·信号处理·傅立叶分析
闭着眼睛学算法2 小时前
【双机位A卷】华为OD笔试之【模拟】双机位A-新学校选址【Py/Java/C++/C/JS/Go六种语言】【欧弟算法】全网注释最详细分类最全的华子OD真题题解
java·c语言·javascript·c++·python·算法·华为od