华为OD机试--寻找身高相近的小朋友

题目描述:

小明今年升学到小学一年级,来到新班级后发现其他小朋友们身高参差不齐,然后就想基于各小朋友和自己的身高差对他们进行 排序,请帮他实现排序。 输入描述: 第一行为正整数H和N,0<H<200,为小明的身高,0<N<50,为新班级其他小朋友个数。 第二行为N个正整数H1-HN,分别是其他小朋友的身高,取值范围0<Hi<200(1<=i<=N),且N个正整数各不相同。

输出描述:

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

补充说明:

示例1 输入: 100 10 95 96 97 98 99 101 102 103 104 105

输出: 99 101 98 102 97 103 96 104 95 105

说明: 小明身高100,班级学生10个,身高分别为95 96 97 98 99 101 102 103 104 105,按身高差排序后结果为:99 101 98 102 97 103 96 104 95 105。

#定义排序方法
def sort_student_height(H, heights):

    #计算小明与同学们的身高差并存到列表
    height_diffs = [(height, abs(H-height)) for height in hrights]

    #根据身高差值和原始身高对列表进行排序
    sorted_height = sorted(height_diffs, key = lambda x: (x[1], x[0]))
    
    #新建列表提取原始身高排序结果
    sorted_students = [student[0] for student in sorted_height]
    
    #返回排序结果
    return sorted_students

#输入

H,N = map(int,input().split())
heights = list(map(int,input().split()))

#调用方法
sort_height = sort_student_height(H, heights)

#输出
print(' '.join(map(str, sort_height)))

解题思路:

输入:split()根据空格分离元素,map()把分离后的元素转化为int函数的类型。

方法定义:

首先根据题目分析排序方法:身高差升序排序,绝对值相同则根据原始身高升序排序。

因此首先计算身高差放入列表,再使用sorted()方法对身高差列表进行排序,key作为排序依据,使用lambda函数可以分离排序条件,将身高差列表中元素(元组)的两个排序条件:身高差、原始身高,按照排序逻辑放置,先根据身高差排序(身高差列表中元素(元组)的前一位),身高差相同时则根据原始身高(身高差列表中元素(元组)的后一位)进行排序。

最后对排序后的列表进行提取原始身高操作,取元组中的前一位加入列表。返回原始身高排序后的列表。

输出:空格间断,用join()方法依次将map()转化后的结果列表中的元素添加到空格后

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值