华为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.多条件排序
说明:题目来源于网络,代码为自己练习所写,不保证通过率!
#华为机试题#