自己怎么做鲜花网站,呼和浩特网站运营,房山网站建设,frontpage网页制作成品文章目录 题目描述与示例题目描述输入描述输出描述示例一输入输出 示例二输入输出 解题思路代码时空复杂度 进阶华为OD算法/大厂面试高频题算法练习冲刺训练 题目描述与示例
题目描述
某学校举行运动会,学生们按编号(1、2、3.....n) 进行标识,
现需要按照身高由低到高排列对身高相同的人按体重由轻到重排列对于身高体重都相同的人维持原有的编号顺序关系。
请输出排列后的学生编号
输入描述
两个序列每个序列由 n 个正整数组成(0 n 100)。第一个序列中的数值代表身高第二个序列中的数值代表体重。
输出描述
排列结果每个数值都是原始序列中的学生编号编号从 1 开始
示例一
输入
4
100 100 120 130
40 30 60 50输出
2134示例二
输入
3
90 110 90
45 60 45输出
132解题思路
我们一共有三个列表身高列表h体重列表w以及编号列表idx。
为了让身高、体重和编号的信息能够一一对应我们使用zip()函数将这三个列表里面的内容绑定为一个包含n个三元元组的列表lst即
lst list(zip(h, w, idx))在排序方面题目要求我们按身高从小到大排序身高相同再按体重从小到大排序身高体重相同则按照编号从小到大排序均为升序排序。所以直接调用列表的方法sort()或者内置函数sorted()即可完成。即
lst.sort()最终再将排序后的lst中的编号信息取出来再用字符串的join()方法将排序后的编号顺序组合成一个字符串即可。即
print(.join([str(item[2]) for item in lst]))代码
# 题目2023Q1A-身高提供排序
# 分值100
# 作者闭着眼睛学数理化
# 算法直接调用排序API
# 代码看不懂的地方请直接在群上提问n int(input())
h list(map(int, input().split()))
w list(map(int, input().split()))idx [i for i in range(1, n1)] # 编号列表1到n
lst list(zip(h, w, idx)) # 身高、体重、编号整合为三元的元组组成一个新的列表lstlst.sort() # 直接对lst排序会先按照身高排序再按照体重排序再按照编号排序
print(.join(str(item[2]) for item in lst)) # 排序后取编号组成字符串即为答案时空复杂度
时间复杂度O(NlogN)。排序时间复杂度。
空间复杂度O(N)。
进阶
如果本题稍作修改要求我们先按照身高升序排列再按照体重降序排列应该如何修改代码呢这个时候就要祭出神器lambda匿名函数了。语法如下
lst.sort(key lambda x: (x[0], -x[1])) key是sort()方法或sorted()内置函数的参数表示排序的依据。lambda匿名函数中的x表示的就是lst中的元素即一个个的三元元组。由于sort()默认的排序方式是升序(x[0], -x[1])表示对列表先按照x[0]升序排列在x[0]相同的情况下再按照-x[1]升序排列即按照x[1]降序排列。通过这样的方式我们就实现了身高升序排列再按照体重降序排列的目的。
对于原题目而言如果我们也想显式地写出lambda匿名函数则代码为
lst.sort(key lambda x: (x[0], x[1])) 如果还想再把编号按照升序排列也显式地写出则代码为
lst.sort(key lambda x: (x[0], x[1], x[2])) lambda匿名函数的作用很多。除了sort()之外取最值的两个函数max()和min()中包含参数key表示取最大值或最小值的依据譬如
max(lst, key lambda x: x[0] * x[1]))表示取身高和体重之积最大的那个人所对应的三元元组。
华为OD算法/大厂面试高频题算法练习冲刺训练 华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名目前已服务100同学成功上岸 课程讲师为全网50w粉丝编程博主吴师兄学算法 以及小红书头部编程博主闭着眼睛学数理化 每期人数维持在20人内保证能够最大限度地满足到每一个同学的需求达到和1v1同样的学习效果 60天陪伴式学习40直播课时300动画图解视频300LeetCode经典题200华为OD真题/大厂真题还有简历修改、模拟面试、专属HR对接将为你解锁 可上全网独家的欧弟OJ系统练习华子OD、大厂真题 可查看链接 OD算法冲刺训练课程表 OD真题汇总(持续更新) 绿色聊天软件戳 od1336了解更多