■ 题目描述
【磁盘容量排序】
磁盘的容量单位常用的有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块磁盘容量排序后的结果。
C语言
#include <bits/stdc++.h>
#define CEILING_POS(X) ((X-(int)(X)) > 0 ? (int)(X+1) : (int)(X))
#define CEILING_NEG(X) ((X-(int)(X)) < 0 ? (int)(X-1) : (int)(X))
#define CEILING(X) ( ((X) > 0) ? CEILING_POS(X) : CEILING_NEG(X) )
#define MIN(a, b) ((a) < (b)) ? (a) : (b)
#define MAX(a, b) ((a) > (b)) ? (a) : (b)
int cmpfunc(const void *a, const void *b) {
return (*(int *) a - *(int *) b);
}
int convert(char *capacity) {
int size = 0;
char *upper = strdup(capacity);
for (int i = 0; i < strlen(upper); i++) {
upper[i] = toupper(upper[i]);
}
char *token = strtok(upper, "MGTP");
while (token != NULL) {
int num = atoi(token);
char unit = upper[strlen(token)];
switch (unit) {
case 'M':
size += num;
break;
case 'G':
size += num * 1024;
break;
case 'T':
size += num * 1024 * 1024;
break;
default:
break;
}
token = strtok(NULL, "MGTP");
}
return size;
}
int main() {
int n;
scanf("%d", &n);
char **capacities = (char **) malloc(n * sizeof(char *));
for (int i = 0; i < n; i++) {
capacities[i] = (char *) malloc((20 + 1) * sizeof(char));
scanf("%s", capacities[i]);
}
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (convert(capacities[i]) > convert(capacities[j])) {
char *temp = capacities[i];
capacities[i] = capacities[j];
capacities[j] = temp;
}
}
}
for (int i = 0; i < n; i++) {
printf("%s\n", capacities[i]);
}
return 0;
}
C++
示例1 输入输出示例仅供调试,后台判题数据一般不包含示例
输入
3
1G
2G
1024M
输出
1G
1024M
2G
说明文章来源:https://www.toymoban.com/news/detail-624867.html
1G和1024M容量相等,稳定排序要求保留它们原来的相对位置,故1G在1024M之前。
示例2 输入输出示例仅供调试,后台判题数据一般不包含示例
输入
3
2G4M
3M2G
1T
输出
3M2G
2G4M
1T
说明
1T的容量大于2G4M,2G4M的容量大于3M2G。文章来源地址https://www.toymoban.com/news/detail-624867.html
#include <bits/stdc++.h>
using namespace std;
int getSize(string s)
{
int ans = 0;
int curNum = 0;
for (char c: s) {
if (isdigit(c)) {
curNum = curNum * 10 + (c - '0');
} else {
if (c == 'M') {
ans += curNum;
} else if (c == 'G') {
ans += curNum * 1024;
} else if (c == 'T') {
ans += curNum * 1024 * 1024;
}
curNum = 0;
}
}
return ans;
}
bool cmp(const string &s1, const string &s2)
{
return getSize(s1) < getSize(s2);
}
int main(int argc, const char *argv[])
{
string s;
int n;
cin >> n;
vector<string> size;
while (n--) {
cin >> s;
size.push_back(s);
}
stable_sort(size.begin(), size.end(), cmp);
for (string s: size) {
cout << s << endl;
}
return 0;
}
到了这里,关于华为OD机考--【磁盘容量排序】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!