题解 | #成绩排序#
成绩排序
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]); } } } } } }