题解 | #成绩排序#

成绩排序

https://www.nowcoder.com/practice/8e400fd9905747e4acc2aeed7240978b?tpId=37&tqId=21291&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=

写的有些乱,当提供一种思路,整体还有优化的地方。

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        int max = in.nextInt();
        int sort = in.nextInt();
        // 存储名称与成绩集合
        List<String> names = new ArrayList<>();
        List<Integer> grades = new ArrayList<>();
        for (int i = 0; i < max; i++) {
            String name = in.next();
            int grade = in.nextInt();
            if (i == 0) {   // 第一组数据直接添加进集合
                names.add(name);
                grades.add(grade);
            } else {    // 其他组数据判断插入
                sortList(names, grades, name, grade, sort);
            }
        }

        // 根据排序类型输出不同数据
        if (sort == 1) {
            for (int i = 0; i < grades.size(); i++) {
                System.out.println(names.get(i) + " " + grades.get(i));
            }
        } else {
            for (int i = grades.size() - 1; i >= 0; i--) {
                System.out.println(names.get(i) + " " + grades.get(i));
            }
        }
    }

    /**
     * 判断插入
     * @param names 名称集合
     * @param grades 成绩集合
     * @param name 当前输入名称
     * @param grade 当前输入成绩
     * @param sort 排序类型
     */
    private static void sortList(List<String> names, List<Integer> grades,
                                 String name, int grade, int sort) {
        int l = 0, r = grades.size(), num = 0;
        while (l <= r) {
            num = (r + l) / 2;
            // 判断中位值是否小于当前输入成绩
            if (grades.get(num) < grade) {
                // 中位值等于集合最大值时直接添加
                if (num == grades.size() - 1) {
                    names.add(name);
                    grades.add(grade);
                    return;
                }
                // 中位值后一位大于当前输入成绩时进行插入
                if (grades.get(num + 1) > grade) {
                    names.add(num + 1, name);
                    grades.add(num + 1, grade);
                    return;
                }
                // 修改左标位置
                l = num;
            }
            // 判断中位值是否大于当前输入成绩
            if (grades.get(num) > grade) {
                // 中位值等于0时插入值到下标0
                if (num == 0) {
                    names.add(0, name);
                    grades.add(0, grade);
                    return;
                }
                // 中位值前一位小于当前输入成绩时进行插入
                if (grades.get(num - 1) < grade) {
                    names.add(num, name);
                    grades.add(num, grade);
                    return;
                }
                // 修改右标位置
                r = num;
            }
            // 判断中位值是否等于当前输入成绩
            if (grades.get(num) == grade) {
                // 集合中相等值可能会出现多个,根据不同排序方式,插入位置不同
                // 升序时
                if (sort == 1) {
                    int count = 1;
                    while (true) {
                        if (num + count <= grades.size() - 1 &&
                                grades.get(num + count) == grade) count++;
                        else {
                            num = num + count - 1;
                            break;
                        }

                    }
                    names.add(num + 1, name);
                    grades.add(num + 1, grade);
                }
                // 降序时
                if (sort == 0) {
                    int count = 1;
                    while (true) {
                        if (num - count >= 0 && grades.get(num - count) == grade) count++;
                        else {
                            num = num - count + 1;
                            break;
                        }
                    }
                    names.add(num, name);
                    grades.add(num, grade);
                }
                return;
            }
        }
    }
}

#笔试##华为机试#
全部评论

相关推荐

Noob1024:一笔传三代,人走笔还在
点赞 评论 收藏
分享
喜欢走神的孤勇者练习时长两年半:爱华,信华,等华,黑华
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务