【华为机试】比较身高问题

小明的身高排序算法
这篇博客主要介绍了如何解决一个关于身高排序的问题。小明在新班级中想要根据与自己身高差对其他小朋友进行排序,具体规则是:身高差绝对值最小的排前面,若身高差相同,则个子小的排前面。博主给出了输入输出描述及示例,并可能提供了相应的代码实现。

题目描述:

小明今年升学到了小学一年级,
来到新班级后,发现其他小朋友身高参差不齐,
然后就想基于各小朋友和自己的身高差,对他们进行排序,
请帮他实现排序

输入描述

第一行为正整数 HN
0 < H < 200 为小明的身高
0 < H < 50 为新班级其他小朋友个数
第二行为N个正整数
H1 ~ Hn分别是其他小朋友的身高
取值范围0 < Hi < 200
N个正整数各不相同

输出描述

输出排序结果,各正整数以空格分割
和小明身高差绝对值最小的小朋友排在前面
和小明身高差绝对值最大的小朋友排在后面
如果两个小朋友和小明身高差一样
则个子较小的小朋友排在前面

示例1

输入
100 10
95 96 97 98 99 101 102 103 104 105
输出
99 101 98 102 97 103 96 104 95 105

代码

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

public class OneStar_06 {
       public static void main(String[] args) {
              Scanner scanner = new Scanner(System.in);
              System.out.println("请输入小明的身高:");
              int H = scanner.nextInt();
              System.out.println("请输入新班级其他小朋友个数:");
              int N = scanner.nextInt();
              List<Integer> n = new ArrayList<>(N);
              System.out.println("请输入小朋友的身高,使用回车分隔");
              for(int i = 0 ; i < N ; i++){
                     n.add(scanner.nextInt());
              }
              solution(H,n);
       }

       private static void solution(int h, List<Integer> n) {
               /**
                * 思路:
                     1、使用List.sort()方法,重写Comparator接口的compare抽象方法,来制定自定义排序规则。
                     Array.sort()方法不能对int数组做自定义排序,只能对Integer数组做自定义排序。因为int数组没有实现该接口。
                            a、书写格式:
                            new Comparator<Integer>(){
                                   @Override
                                   public int compare(Integer h1 , Interger h2){
                                          return h1-h2;
                                   }
                            })

                            b、h1和h2表示两个需要比较的值()
                            
                            c、compare返回值是h1和h2的权重。
                                   当返回值为+1,h1的权重大于h2。
                                   返回值为0,h1和h2权重一样。
                                   返回值为-1,h1的权重小于h2。

                            d、compare的排序结果按照权重,由小到大进行排序(权重默认升序排列)。
                */

                //开始进行Array.sort排序
                n.sort(new Comparator<Integer>() {
                       @Override
                       public int compare(Integer h1 , Integer h2){
                              //获得比较值diff1和diff2,按照题目要求,比较对象都为绝对值。
                              int diff1 = Math.abs(h1-h);
                              int diff2 = Math.abs(h2-h);

                              //进行权重判断
                              //当身高差不一样,将身高差由小到大排列(diff1-diff2)。
                              //☆如果想要将身高差由大到小排列(diff2-diff1)
                              if(diff1 != diff2){
                                     return diff1-diff2;
                                   }
                              //当身高差一致,将身高由小到大排列(h1-h2)。
                              //☆如果想要将身高由大到小排列(h2-h1)
                              else{
                                     return h1-h2;
                                   }     
                       }
                });

                //使用StringBuilder来连接多个数值,并且每个数值间连接一个空格。
                //StringBuilder可以提高资源运行效率,但是线程不安全,如果要使线程安全,使用StringBuffer。
                //append()方法相当于字符串的  +  号
                StringBuilder sb = new StringBuilder();
                for(int i = 0 ; i < n.size() ; i++){
                       sb.append(n.get(i)).append(" ");
                }
                System.out.println(sb.toString());
       }
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值