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

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

提示:本题是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 +" ");
            }

        }

总结

提示:本题经验:

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

你可能感兴趣的:(大厂面试高频题之数据结构与算法,java,数据结构,算法,面试,leetcode)