【编程题目 | 100分】磁盘容量排序 [ 100 / 中等 ]
题目描述
磁盘的容量单位常用的有
M G T
他们之间的换算关系为 1T =1024G 1G=1024M
现在给定n块磁盘的容量,请对他们按从小到大的顺序进行稳定排序
例如给定5块盘的容量
5
1T
20M
3G
10G6T
3M12G9M
排序后的结果为
20M
3G
3M12G9M
1T
10G6T
注意单位可以重复出现
上述3M 12G 9M表示的容量即为 3M 12G 9M 和12M 12G相等。
输入描述
- 输入第一行包含一个整数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
思路分析
- 根据磁盘容量从小到大的顺序,首先要统一单位,转为最小单位。
- 从字符串读取容量,可以使用正则表达式获取。
- 稳定排序要求相等值保留原来位置。
参考代码
注:题目网上找的,参考代码是练习用,仅供参考,并不保证用例通过率。
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 磁盘容量排序
*/
public class Test0023 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
String s = scanner.nextLine(); // nextInt后有空行,先读取一次
String[] disksStr = new String[n];
for (int i = 0; i < n; i++) {
disksStr[i] = scanner.nextLine();
}
List<Disk> diskList = new ArrayList<>(n);
Pattern pattern = Pattern.compile("[0-9]+|M|G|T");
String str;
String diskStr;
for (int i = 0; i < n; i++) {
diskStr = disksStr[i];
Matcher matcher = pattern.matcher(diskStr);
Disk disk = new Disk();
disk.index = i;
disk.capacityStr = diskStr;
int total = 0; // 单个磁盘总容量,最小单位M
int current = 0; // 一个单位的数据容量
while (matcher.find()) {
str = matcher.group();
if (str.matches("[0-9]+")) {
// 数字
current = Integer.parseInt(str);
} else {
// 单位
if ("T".equals(str)) {
current *= (1024 * 1024);
} else if ("G".equals(str)) {
current *= 1024;
}
total += current;
}
}
disk.capacity = total;
diskList.add(disk);
}
diskList.sort(Comparator.comparingInt((Disk o) -> o.capacity).thenComparingInt(o -> o.index));
for (Disk disk : diskList) {
System.out.println(disk.capacityStr);
}
}
static class Disk {
public int index;
public String capacityStr;
public int capacity;
}
}