【华为机试】绝对值排序

题目描述

小明来到一个新班级,想根据班级同学的身高和自己的升高差值排一个序,差值的绝对值越小,则未知越靠前。如果差值相同,则身高越低的越排前面。输入两行数据,第一行表示小明的身高,第二行表示班级其它同学身高。
示例:

输入:200【小明身高】
输入:198 199 200 201 202
输出:200 199 201 198 202

题解

解题思路很简单,求绝对值排序即可,有一定代码基础的人都写的出来。

题解一

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s1 = in.nextLine();
        String s2 = in.nextLine();
        in.close();
        String[] split1 = s1.split(" ");
        String[] split2 = s2.split(" ");
        int self = Integer.parseInt(split1[0]);
        int num = Integer.parseInt(split1[1]);
        Map<Integer, String> map = Arrays.stream(split2)
                .map(Integer::parseInt)
                .collect(Collectors.toMap(item -> Math.abs(item - self), String::valueOf, (v1, v2) -> {
                    if (Integer.parseInt(v1) > Integer.parseInt(v2)) {
                        return v2 + " " + v1;
                    } else {
                        return v1 + " " + v2;
                    }
                }));
        List<Integer> collect1 = map.keySet().stream().sorted().collect(Collectors.toList());
        StringJoiner builder = new StringJoiner(" ");
        for (Integer key : collect1) {
            builder.add(map.get(key));
        }
        System.out.println(builder);
    }
}

题解二

        Scanner in = new Scanner(System.in);
        String s1 = in.nextLine();
        String s2 = in.nextLine();
        in.close();
        String[] split1 = s1.split(" ");
        String[] split2 = s2.split(" ");
        int self = Integer.parseInt(split1[0]);
        int num = Integer.parseInt(split1[1]);
        String res = Arrays.stream(split2).map(Integer::parseInt).sorted((v1, v2) -> {
            int abs1 = Math.abs(v1 - self);
            int abs2 = Math.abs(v2 - self);
            if (abs1 != abs2) return abs1 - abs2;
            return v1 - v2;
        }).map(String::valueOf).collect(Collectors.joining(" "));
        System.out.println(res);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值