题目描述
磁盘的容量单位常用的有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块磁盘容量排序后的结果。
用例
输入 |
3 |
输出 |
1G |
说明 | 1G和1024M容量相等,稳定排序要求保留它们原来的相对位置,故1G在1024M之前。 |
输入 |
3 |
输出 |
3M2G |
说明 | 1T的容量大于2G4M,2G4M的容量大于3M2G。 |
题目解析
简单的字符串操作+排序,具体逻辑请看代码。
2023.06.15
本题Java注意int的整型溢出,建议使用long。
Java算法源码
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] capacitys = new String[n];
for (int i = 0; i < n; i++) capacitys[i] = sc.next();
getResult(capacitys);
}
public static void getResult(String[] capacitys) {
Arrays.sort(capacitys, (a, b) -> Long.compare(calc(a), calc(b)));
for (String capacity : capacitys) {
System.out.println(capacity);
}
}
public static Long calc(String capacity) {
long ans = 0;
StringBuilder num = new StringBuilder();
for (int i = 0; i < capacity.length(); i++) {
char c = capacity.charAt(i);
if (c >= '0' && c <= '9') {
num.append(c);
} else {
switch (c) {
case 'M':
ans += Long.parseLong(num.toString());
break;
case 'G':
ans += Long.parseLong(num.toString()) * 1024;
break;
case 'T':
ans += Long.parseLong(num.toString()) * 1024 * 1024;
break;
}
num = new StringBuilder();
}
}
return ans;
}
}
JS算法源码
/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const lines = [];
let n;
rl.on("line", (line) => {
lines.push(line);
if (lines.length === 1) {
n = lines[0] - 0;
}
if (n && lines.length === n + 1) {
lines.shift();
getResult(lines);
lines.length = 0;
}
});
function getResult(capacitys) {
capacitys
.sort((a, b) => calc(a) - calc(b))
.forEach((cap) => console.log(cap));
}
function calc(capacity) {
let ans = 0;
const num = [];
for (let i = 0; i < capacity.length; i++) {
const c = capacity[i];
if (c >= "0" && c <= "9") {
num.push(c);
} else {
switch (c) {
case "M":
ans += parseInt(num.join(""));
break;
case "G":
ans += parseInt(num.join("")) * 1024;
break;
case "T":
ans += parseInt(num.join("")) * 1024 * 1024;
break;
}
num.length = 0;
}
}
return ans;
}
Python算法源码
# 输入获取
n = int(input())
capacitys = [input() for _ in range(n)]
def calc(cap):
ans = 0
num = []
for i in range(len(cap)):
c = cap[i]
if '0' <= c <= '9':
num.append(c)
else:
if c == 'M':
ans += int("".join(num))
elif c == 'G':
ans += int("".join(num)) * 1024
elif c == 'T':
ans += int("".join(num)) * 1024 * 1024
num = []
return ans
# 算法入口
def getResult():
capacitys.sort(key=lambda x: calc(x))
for cap in capacitys:
print(cap)
# 算法调用
getResult()
免责声明:
1、IT资源小站为非营利性网站,全站所有资料仅供网友个人学习使用,禁止商用
2、本站所有文档、视频、书籍等资料均由网友分享,本站只负责收集不承担任何技术及版权问题
3、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除下载链接并致以最深的歉意
4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
5、一经注册为本站会员,一律视为同意网站规定,本站管理员及版主有权禁止违规用户
6、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和IT资源小站的同意
7、IT资源小站管理员和版主有权不事先通知发贴者而删除本文
评论0