前言
工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力,无聊之余打算用一些大厂的编程题练练手。希望通过这些分享能够帮到一些人,也希望能和看到此文的大神们沟通交流,提升自己,更希望在此期间能够找到一份理想的工作。
题目描述
K小姐是一位教师,她需要一个学生成绩管理系统来帮助她对学生的考试成绩进行排名。系统需要支持按照总分或者单科成绩进行排序。你能帮帮她吗?
输入
- 第一行包含两个正整数 n 和 m,分别表示学生人数和科目数量。(0<n<100, 0<m<10)
- 第二行包含 m 个由空格隔开的科目名称。科目名称只由英文字母构成,单个长度不超过 10个字符。
- 科目的出现顺序和后续输入的学生成绩一一对应,不会出现重复的科目名称。
- 接下来的n 行,每行包含一个学生的姓名和该生 m 个科目的成绩(空格隔开)。学生姓名只由英文字母构成,长度不超过 10 个字符。
- 成绩是 0 到 100 的整数,依次对应第二行输入的科目。
- 最后一行输入一个字符串,表示用作排名的科目名称。若该科目不存在,则按总分进行排序。
输出
输出一行,表示按成绩排序后的学生姓名,用空格隔开。如果有成绩相同的情况,则按照学生姓名的字典序进行排序。
示例
输入
3 2
yuwen shuxue
fangfang 95 90
xiaohua 88 98
minmin 100 82
shuxue
输出
xiaohua fangfang minmin
解题思路
- 使用TreeMap存储某一科的成绩,key为成绩,Value为 学生姓名的集合,这样就能默认按成绩的正序进行自动排序。
- 上述的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));
}
}
}