题解 | #成绩排序#
成绩排序
https://www.nowcoder.com/practice/8e400fd9905747e4acc2aeed7240978b
属于偷懒模式,根据可观情况假定最高成绩为100分,用分数来标记二维数组的下标。二维数组的列用来按顺序保存相同分数的记录。用空间换时间,有点像操场上所有学生按班级排成不同的列,列里面学生按照座位号依次站队。缺点是如果最高成绩比较大,记录数比较多,会导致很大的空间开销。优点是查询速度快,根据最低分和最高分遍历局部数组就可以得到结果,不需要另外排序。
import java.util.Scanner;
//解题思路:空间换时间,非最优,假设成绩最高100分,用字符串二维数组的行号表示分数,列按照顺序存储相同分数的不同记录
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = Integer.parseInt(sc.nextLine());
// System.out.println(num);
int order = Integer.parseInt(sc.nextLine());
// System.out.println(order);
//创建字符串二维数组
String[][] arr = new String[101][num + 1]; //字符数组默认为空,列长度最大为num(即所有人成绩都相同的情况)
int minscore = 0;
int maxscore = 0;
while (sc.hasNext()) {
String str = sc.nextLine();
// System.out.println(str);
String[] strarr = str.split(" ");
int score = Integer.parseInt(strarr[1]);
for (int i = 0; i <= num; i++) {
if (null == arr[score][i]) {
arr[score][i] = str;
break;
}
}
minscore = Math.min(score, minscore); //记录最低分
maxscore = Math.max(score, maxscore); //记录最高分
}
//遍历数组输出内容
if (order == 1) { //升序
for (int j = minscore; j <= maxscore; j++) {
for (int k = 0; k <= num; k++) {
if (null == arr[j][k]) {
break;
} else {
System.out.println(arr[j][k]);
}
}
}
} else if (order == 0) { //降序
for(int m = maxscore; m >= minscore; m--){
for(int n = 0; n <= num; n++){
if(null == arr[m][n]){
break;
}else{
System.out.println(arr[m][n]);
}
}
}
}
}
}


