题解 | #成绩排序#

成绩排序

https://www.nowcoder.com/practice/8e400fd9905747e4acc2aeed7240978b

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
        String[] students;
        String a;
        char[] chs;
        int[][] grades;
        int[] nameLen;
        int i = 0, l, n = 0, rules;
        try {
            a = r.readLine();
            chs = a.toCharArray();
            l = chs.length;
            while (i < l) {
                n *= 10;
                n += chs[i] - '0';
                i++;
            }
            students = new String[n];//初始化学生信息数组
            grades = new int[n][2];//初始化成绩数组
            nameLen = new int[n];//初始化学生名字长度数组
            a = r.readLine();
            chs = a.toCharArray();
            rules = chs[0] - '0';//获得排序方式
            i = 0;
            while ((a = r.readLine()) != null && !a.isEmpty()) {
                students[i] = a;//学生信息包括名字和成绩放入成绩数组
                grades[i][0] = i;//成绩数组第一列放入学生的编号,
                nameLen[i] = parseSutd(a, grades[i]);//名字长度数组中学生编号对应相应的名字长度
                i++;
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        //返回值大于0,交换位置
        Arrays.sort(grades, (o1, o2) -> {
            if (rules == 1) return o1[1] - o2[1];//o1-o2>0,则相互交换位置,为1时是升序
            else return o2[1] - o1[1];//为0时是降序
        });
        i = 0;
        a = "";
        while (i < n) {
            a = a + students[grades[i][0]].substring(0, nameLen[grades[i][0]]) + " " + grades[i][1] + "\n";
            i++;
        }
        System.out.print(a);
    }

    //HashMap+TreeMap,自定义comparator指定排序的值和规则
    //
    private static int parseSutd(String str, int[] grades) {
        char[] chs = str.toCharArray();
        int i = 0, j = 0, l = chs.length, n = 0;
        boolean grade = false;
        while (i < l) {
            if (chs[i] == ' ') {
                grade = true;
                i++;
                continue;
            }
            if (grade) {
                n *= 10;
                n += chs[i] - '0';
                if (i == l - 1) grades[1] = n;
                i++;
                continue;
            }
            j++;
            i++;
        }
        return j;
    }
}

全部评论

相关推荐

用微笑面对困难:加急通知你不合适,也很吗有礼貌了你。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务