华为OD机试真题B卷 Java 实现【小朋友排队】-LMLPHP

一、题目描述

小明今年升学到了小学1年级,来到新班级后,发现其他小朋友身高参差不齐,然后就想基于每个小朋友和自己的身高差,对他们进行排序,请帮他实现排序。

二、输入描述

第一行为正整数h和n。

0 < h < 200为小明的身高、0 < n < 50为新班级其他小朋友个数;

第二行为n个正整数,h1~hn分别是其他小朋友的身高,取值范围0 < hi < 200,且n个正整数各不相同。

三、输出描述

输出排序结果,各正整数以空格分割,和小明身高差绝对值最小的小朋友排在前面,和小明身高差绝对值最大的小朋友排在后面,如果两个小朋友和小明身高一样,则个子较小的小朋友排在前面。

四、解题思路

先按身高差绝对值排序,再按照身高排序。

五、Java算法源码

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    // 小明的身高
    int h = Integer.parseInt(sc.nextLine().split(" ")[0]);

    // 其它小朋友的身高
    ArrayList<Integer> list = new ArrayList<>();

    int[] heights = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
    for (int i = 0; i < heights.length; i++) {
        list.add(heights[i]);
    }

    // 先按身高差绝对值排序,再按照身高排序。
    list.sort(new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            int d1 = o1 - h > 0 ? o1 - h : h - o1;
            int d2 = o2 - h > 0 ? o2 - h : h - o2;
            if (d1 == d2) {
                return o1 - o2;
            } else {
                return d1 - d2;
            }
        }
    });

    StringBuilder builder = new StringBuilder();
    for (int i : list) {
        builder.append(i).append(" ");
    }

    System.out.println(builder.toString().trim());
}

六、效果展示

1、输入

50 8
46 47 48 49 50 51 52 53

2、输出

50 49 51 48 52 47 53 46

华为OD机试真题B卷 Java 实现【小朋友排队】-LMLPHP


🏆下一篇:华为OD机试真题 Java 实现【云短信平台优惠活动】【2023Q1 200分】,附详细解题思路

🏆本文收录于,华为OD机试(JAVA)(2022&2023)

本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。

华为OD机试真题B卷 Java 实现【小朋友排队】-LMLPHP

05-27 21:19