一、题目描述
小明今年升学到了小学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机试真题 Java 实现【云短信平台优惠活动】【2023Q1 200分】,附详细解题思路
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。