华为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.多条件排序

说明:题目来源于网络,代码为自己练习所写,不保证通过率!

#华为机试题#
全部评论

相关推荐

3 12 评论
分享
牛客网
牛客企业服务