华为OD机试-磁盘容量排序
题目描述
磁盘的容量单位常用的有M G T , 他们之间的换算关系为 1T =1024G 1G=1024M 现在给定n块磁盘的容量,请对他们按从小到大的顺序进行稳定排序
例如给定5块盘的容量 5 1T 20M 3G 10G6T 3M12G9M
排序后的结果为
20M 3G 3M12G9M 1T 10G6T
注意单位可以重复出现
上述3M12G9M表示的容量即为 3M+12G+9M 和12M12G相等
输入描述、 输入第一行包含一个整数n, 2<=n<=100 表示磁盘的个数 接下来的n行,每行一个字符串,2<长度<30 ,表示磁盘的容量 由一个或多个格式为MV的子串组成,其中m表示容量大小,v表示容量单位。例如20M1T, 磁盘容量的范围1~1024的正整数,单位 M G T
输出n行,表示n块磁盘容量排序后的结果。
实例 输入 3 1G 2G 1024M
输出 1G 1024M 2G 说明:稳定排序要求相等值保留原来位置
示例2 3 2G4M 3M2G 1T
输出 3M2G 2G4M 1T
代码实现
# Python3 d = { "M":1, # 取M=1单位 "G":1024, "T":1048576 } def V(disk): """"盘的容量统一单位""" tmp = disk # 复制disk便于替换字母,分离出数字 alp = [] # 收集盘中出现的字母单位 for i in disk: if i.isalpha(): alp.append(i) # 提取字母(如果有出现小写就转大写:alp.append(i.upper()) tmp = tmp.replace(i," ") # 用空格替换字母 lk = list(map(int, tmp.split())) # 分离出的数值 alpv = [d[i] for i in alp] # 分离出的字母对应字典的数值 vl = [lk[i] * alpv[i] for i in range(len(lk))] # 对应相乘 return sum(vl) # 加总 # 1.输入 n = int(input()) disks = [input() for _ in range(n)] # 2.盘处理 res = [] for i, disk in enumerate(disks): res.append((i, disk, V(disk))) # i 盘的原来位置,V(disk)为盘统一单位后的数值 # 3.排序(多条件排序:常用lambda函数) res.sort(key=lambda x:(x[2],x[0])) # 先对V(disk)排序,再对i排序 for disk in res: print(disk[1])
总结
1.字符提取
2.多条件排序
说明:题目来源于网络,代码为自己练习所写,不保证通过率!
#华为机试题#