华为机试:身高体重排序

【编程题目 | 100分】身高体重排序 [ 100 / 中等 ]

身高体重排序
题目描述:

某学校举行运动会,学生们按编号(1、2、3…n)进行标识,现需要按照身高由低到高排列,对身高相同的人,按体重由轻到重排列;对于身高体重都相同的人,维持原有的编号顺序关系。请输出排列后的学生编号。

输入描述:

两个序列,每个序列由n个正整数组成(0 < n <= 100)。第一个序列中的数值代表身高,第二个序列中的数值代表体重。。

输出描述:

排列结果,每个数值都是原始序列中的学生编号,编号从1开始,身高从低到高,身高相同体重从轻到重,体重相同维持原来顺序。

示例 1:
输入
4
100 100 120 130
40 30 60 50
输出
2 1 3 4
示例 2:
输入
3
90 110 90
45 60 45
输出
1 3 2
参考代码:

Java代码实现:

  1. 使用HashMap,编号作为key,身高体重数组作为value,按value进行排序。其中对HashMap的排序需要先转化为List,再对List进行排序。
import java.util.*;

public class HeightWeightSort {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        in.nextLine();
        String[] height = in.nextLine().split(" ");
        String[] weight = in.nextLine().split(" ");
        int[] h = new int[n];
        int[] w = new int[n];
        Map<Integer, int[]> map = new HashMap<>();
        for (int i = 0; i < n; i++) {
            h[i] = Integer.parseInt(height[i]);
            w[i] = Integer.parseInt(weight[i]);
            map.put(i, new int[]{0, 0});
            int[] info = map.get(i);
            info[0] = h[i];
            info[1] = w[i];
        }

        // Map按value排序,先将map转为list,再排序list(按value值进行排序)
        List<Map.Entry<Integer, int[]>> list = new ArrayList<Map.Entry<Integer, int[]>>(map.entrySet());
        // 通过比较器来实现排序
        Collections.sort(list, new Comparator<Map.Entry<Integer, int[]>>() {
            @Override
            public int compare(Map.Entry<Integer, int[]> o1, Map.Entry<Integer, int[]> o2) {
                // 降序排序
                int re = o1.getValue()[0] - o2.getValue()[0];
                if (re != 0) {
                    return re;
                }
                re = o1.getValue()[1] - o2.getValue()[1];
                if (re != 0) {
                    return re;
                }
                return 0;
            }
        });

        StringBuilder sb = new StringBuilder();
        for (Map.Entry<Integer, int[]> mapping : list) {
            sb.append(String.valueOf(mapping.getKey() + 1) + " ");
        }
        System.out.print(sb.toString().trim());
    }
}

注:直接使用lambda表达式排序

import java.util.*;

public class HeightWeightSort {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        in.nextLine();
        String[] height = in.nextLine().split(" ");
        String[] weight = in.nextLine().split(" ");
        int[] h = new int[n];
        int[] w = new int[n];
        Map<Integer, int[]> map = new HashMap<>();
        for (int i = 0; i < n; i++) {
            h[i] = Integer.parseInt(height[i]);
            w[i] = Integer.parseInt(weight[i]);
            map.put(i, new int[]{0, 0});
            int[] info = map.get(i);
            info[0] = h[i];
            info[1] = w[i];
        }

        // Map按value排序,先将map转为list,再排序list(按value值进行排序)
        List<Map.Entry<Integer, int[]>> list = new ArrayList<Map.Entry<Integer, int[]>>(map.entrySet());
        
        // 直接使用lambda表达式排序
        list.sort((o1, o2) -> (o1.getValue()[0]==o2.getValue()[0]?(o1.getValue()[1]-o2.getValue()[1]):(o1.getValue()[0]-o2.getValue()[0])));

        StringBuilder sb = new StringBuilder();
        for (Map.Entry<Integer, int[]> mapping : list) {
            sb.append(String.valueOf(mapping.getKey() + 1) + " ");
        }
        System.out.print(sb.toString().trim());
    }
}
  1. 二维数组排序,这道题不需要统计频次,可以不使用哈希表,直接使用二维数组进行存储,对二维数组进行排序即可。对二维数组排序的时候可以使用Comparator接口也可以使用lambda表达式。
import java.util.*;

public class HeightWeightSort {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        in.nextLine();
        String[] height = in.nextLine().split(" ");
        String[] weight = in.nextLine().split(" ");

        // 不用map存储,直接二维数组,存编号,身高和体重
        int[][] ints = new int[n][3];
        for(int i = 0; i < n; i++){ 
            ints[i][0] = i + 1;
            ints[i][1] = Integer.parseInt(height[i]);
            ints[i][2] = Integer.parseInt(weight[i]);
        }
        // 二维数组多关键字排序,使用Comparator接口
        Arrays.sort(ints, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                if(o1[1] == o2[1])
                    return o1[2] -o2[2];
                else
                    return o1[1] - o2[1];
            }
        });

        // 直接使用lambda表达式排序
        // Arrays.sort(ints, (e1,e2)->(e1[1]==e2[1]?(e1[2]-e2[2]):(e1[1]-e2[1])));

        for(int i = 0; i < ints.length; i++) {
            if (i == ints.length - 1) {
                System.out.print(ints[i][0]);
            } else{
                System.out.print(ints[i][0] + " ");
            }
        }
    }
}

注:直接使用lambda表达式排序

import java.util.*;

public class HeightWeightSort {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        in.nextLine();
        String[] height = in.nextLine().split(" ");
        String[] weight = in.nextLine().split(" ");
        // 不用map存储,直接二维数组,存编号,身高和体重
        int[][] ints = new int[n][3];
        for(int i = 0; i < n; i++){ 
            ints[i][0] = i + 1;
            ints[i][1] = Integer.parseInt(height[i]);
            ints[i][2] = Integer.parseInt(weight[i]);
        }
        // 直接使用lambda表达式排序
        Arrays.sort(ints, (e1,e2)->(e1[1]==e2[1]?(e1[2]-e2[2]):(e1[1]-e2[1])));
        for(int i = 0; i < ints.length; i++) {
            if (i == ints.length - 1) {
                System.out.print(ints[i][0]);
            } else{
                System.out.print(ints[i][0] + " ");
            }
        }
    }
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值