通过率 51% · 提交 520 · 通过 266
小慕在整理一批磁盘的容量数据,常用的单位有 M、G、T,它们之间的换算关系是 1T = 1024G,1G = 1024M。 现在小慕拿到了 n 块磁盘的容量,需要将它们按从小到大的顺序进行。 例如,小慕手中有 5 块磁盘,容量分别为 1T、20M、3G、10G6T、,排序后的结果为 20M、3G、3M12G9M、1T、10G6T。 需要注意的是,单位可以重复出现,例如 3M12G9M 表示的容量与 12M12G 相等。 所谓稳定排序,指的是对于大小相同的元素,应该按照它们在原先数组中的位置进行排序。
这类题属于华为 OD 机考真题方向中「100分 / 排序」方向的高频题型,通常考察对「100分 / 排序」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
输入第一行包含一个整数n,2 <= n <= 100,表示磁盘的个数。
接下来的 n 行,每行一个字符串,2 < 长度 < 30,表示磁盘的容量,由一个或多个格式为MV的子串组成,其中M表示容量大小,V表示容量单位,例如20M、1T。
磁盘容量的范围是1 ~ 1024的正整数,单位M、G、T。
输出n行,表示n块磁盘容量排序后的结果
示例 1
输入示例
3 1G 2G 1024M
输出示例
1G 1024M 2G
稳定排序要求相等值保留原来位置。
示例 2
输入示例
3 2G4M 3M2G 1T
输出示例
3M2G 2G4M 1T
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
本题也是属于 lambda 匿名函数 在 sort() 方法中的运用,主要考察基础语法。本题排序有两个依据:
因此我们需要将所有输入的磁盘容量字符串 s 转换为统一的单位。 注意到最小的单位是 M,故应该将所有输入的磁盘容量转化为以 M 为单位的数值。 该过程可以通过以下的 convert(s) 函数来完成:
另外,由于要求了 稳定排序,在原数组中的索引也应该被记录,故在储存输入时应该同时储存 s 和 i:
在排序过程中,使用 lambda 匿名函数 对排序依据进行指定,先依据 convert(s),再依据下标 i 进行排序。即:
复杂度分析 设 n 为磁盘数量,L 为单个容量字符串的长度。convert 函数逐字符扫描一个容量字符串:数字字符累积进 num,遇到单位字符就按 M 为 1、G 为 1024、T 为 1024×1024 的倍率把 int(num) 结算进 total 并清空 num,单次调用是 O(L)。Python 版排序时,sort 的 key 函数对每个元素只求值一次,因此 convert 总共只被调用 n 次,换算共花 O(n×L);之后排序比较的是 (换算数值, 原下标) 元组,单次比较为常数代价,排序本身 O(n log n)。总时间复杂度为 O(n×L + n log n),瓶颈在逐串换算与排序这两步。需要留意的是 C++ 参考代码把 convert 写在了比较器里,每次比较都要重新换算两个字符串,实际是 O(n log n × L),数据量大时不如 Python 版「先算好键再排序」的方式高效。空间上,lst 存 n 个(字符串, 下标)对,空间复杂度为 O(n)。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有