给游戏中的士兵们排一个整齐的队列

给游戏中的士兵们排一个整齐的队列

提示:本题是20220409美团笔试题2
熟悉数据结构,想到解决方法,很重要
比较器的运用是很重要的能力



题目:

小团成了游戏中的营长,他打算给游戏中的士兵们排一个整齐的队。目标是让这些士兵排成整齐的一列,
从左到右士兵们的身高逐渐增加,当两个士兵的身高一样的时候,就按照他们名字的字典序进行排列,因为小团觉得这样排起来最美观。
形式化地,给出n个士兵的身高(因为是在游戏中,身高可能很离谱)与名字(仅包含小写英文字母,并且我们保证两个不同士兵的名字不同),要将他们按照身高从小到大排序,如果身高相同则按照名字的字典序排序。

字典序:在英文字典中,排列单词的顺序是先按照第一个字母以升序排列(即a、b、c……z 的顺序);
如果第一个字母一样,那么比较第二个、第三个乃至后面的字母。如果比到最后两个单词不一样长(比如,sigh 和 sight),那么把短者排在前。

输入描述
第一行一个正整数n,表示士兵数
第二行n个空格隔开的正整数h[1,2,…n],h[i]表示第 i 个士兵的高度。
第三行n个空格隔开的字符串s[1,2,…n], s[i]表示第 i 个士兵的名字,
注意,士兵的名字仅包含小写英文字母且没有重复的名字。
n<=50000,h[i]<=300 , s[i]仅包含小写英文字母且长度不大于10

输出描述
输出一行,包含n个字符串s’[1,2,…n],s‘[i]表示经过排序后从左到右站在第i个位置的士兵的名字,
不同名字间用单个空格隔开。


一、审题

当时我看到这句话:从左到右士兵们的身高逐渐增加,当两个士兵的身高一样的时候,就按照他们名字的字典序进行排列
瞬间,我就知道要用比较器,然后排序即可。
图1

二、解题

怎么做呢?

首先建立一个士兵Person对象,属性有身高和名字

//构造一个对象
        public static class Person{
            public int height;
            public String name;

            public Person(int h, String s){
                height = h;
                name = s;
            }
        }

然后,按照那句话,身高不同,则按照身高排序,身高相同,按照名字的字典序排序;都是升序,那比较器需要返回-1,这个java的特点,非常方便的。
必定写一个比较器:

//用比较器搞定
        public static class personComparator implements Comparator<Person>{
            @Override
            public int compare(Person p1, Person p2){
                if (p1.height != p2.height) return p1.height - p2.height;
                else return p1.name.compareTo(p2.name);//否则按照名字的字典序,升序
            }
        }

然后,输入的过程中,一次把身高名字放入Person对象数组,然后用系统排序函数排序即可

public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            int N = in.nextInt();
            int[] height = new int[N];
            Person[] people = new Person[N];
            for (int i = 0; i < N; i++) {
                height[i] = in.nextInt();
            }
            for (int i = 0; i < N; i++) {
                //在这就要造对象
                String name = in.next();
                people[i] = new Person(height[i], name);
            }

            Arrays.sort(people, new personComparator());//用比较器排序

            for (int i = 0; i < N; i++) {
                System.out.print(people[i].name +" ");
            }

        }

总结

提示:本题经验:

知道用什么数据结构解决题的敏感度很重要,平时多练习,多积累。
考完一个题,记笔记,复盘,找优化解。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰露可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值