最新华为OD机试
题目描述
磁盘的容量单位常用的有 M,G,T 这三个等级,它们之间的换算关系为:
- 1T = 1024G
- 1G = 1024M
现在给定 n 块磁盘的容量,请对它们按从小到大的顺序进行稳定排序。
例如给定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 表示容量单位,例如:20M,1T,30G,10G6T,3M12G9M。
- 磁盘容量 m 的范围为 1 到 1024 的正整数
- 容量单位 v 的范围只包含题目中提到的 M,G,T 三种,换算关系如题目描述
输出描述
输出 n 行,表示 n 块磁盘容量排序后的结果。
示例1
输入
3
1G
2G
1024M
1234
输出
1G
1024M
2G
123
说明
1G和1024M容量相等,稳定排序要求保留它们原来的相对位置,故1G在1024M之前。
示例2
输入
3
2G4M
3M2G
1T
1234
输出
3M2G
2G4M
1T
123
说明
1T的容量大于2G4M,2G4M的容量大于3M2G。
解题思路
题目描述要求对磁盘容量进行稳定排序,磁盘容量可以用M
(兆)、G
(千兆)、T
(太字节)表示,它们之间的换算关系为:1T = 1024G,1G = 1024M。磁盘的容量以格式为mv
的子串表示,其中m
表示容量大小,v
表示容量单位。
- 换算规则:
- 1T = 1024G,1G = 1024M,所以所有磁盘容量可以统一转换为
M
单位来方便比较。例如:1T = 1024 * 1024M = 1048576M
1G = 1024M
20M
就是20M
。
- 1T = 1024G,1G = 1024M,所以所有磁盘容量可以统一转换为
- 排序要求:
- 题目要求对这些磁盘容量从小到大排序。
- 稳定排序:如果两个磁盘的容量大小相同,保持它们原输入中的顺序不变。例如,
1G
和1024M
容量相等,但1G
在输入时位于1024M
之前,故在输出时1G
仍应位于1024M
之前。
Java
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = Integer.parseInt(scanner.nextLine());
List<Map.Entry<Integer, String>> res = new ArrayList<>();
// 处理n行磁盘容量
for (int i = 0; i < n; i++) {
String capacity = scanner.nextLine();
int sum = 0;
int left = 0;
int right = 1;
// 将磁盘容量转化为数值
while (right < capacity.length()) {
if (capacity.charAt(right) == 'M' || capacity.charAt(right) == 'G' || capacity.charAt(right) == 'T') {
int val = Integer.parseInt(capacity.substring(left, right));
switch (capacity.charAt(right)) {
case 'M':
sum += val;
break;
case 'G':
sum += val * 1024;
break;
case 'T':
sum += val * 1024 * 1024;
break;
}
left = right + 1; // 更新左指针
}
right++; // 移动右指针
}
// 存储容量及其原始字符串
res