磁盘容量排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <utility>
#include <vector>
#include <algorithm>
using namespace std;

struct Disk {
int size_;
std::string original_;

Disk(int size, std::string original) : size_(size), original_(std::move(original)) {}
};

int main() {

int disk_num;
cin >> disk_num;
cin.ignore(); // 忽略换行符,避免影响下面的 getline

vector<Disk> disk_vec;
for (int i = 0; i < disk_num; ++i) {
std::string disk;
getline(cin, disk);
int sum = 0;
int left = 0;
// 解析磁盘实际大小,转换为 M 单位
for (int right = 0; right < disk.size(); ++right) {
if (disk[right] == 'M' || disk[right] == 'G' || disk[right] == 'T') {
// 确定已经找到单位,切割出数字
auto number = stoi(disk.substr(left, right - left)); // 犯错
if (disk[right] == 'M') {
sum += number;
} else if (disk[right] == 'G') {
sum += number*1024;
} else if (disk[right] == 'T') {
sum += number*1024*1024;
}
left = right + 1;
}
}

// 记录
disk_vec.emplace_back(sum, disk);
}

// 排序
sort(disk_vec.begin(), disk_vec.end(), [](const Disk &left_disk, const Disk &right_disk) {
return left_disk.size_ < right_disk.size_;
});
// 输出原始字符串
for (const Disk &disk : disk_vec) {
cout << disk.original_ << "\n";
}

return 0;
}

题目中有要求说,保持稳定排序。那么如果输入的时候 1G 在 1024M 之前,那么最后输出的时候,稳定排序要求 1G 必须在 1024M 之前输出。

由于最后要输出的是原始字符串,因此定义一个结构体,把这个信息保留,排序之后再输出即可:

1
2
3
4
5
6
struct Disk {
int size_;
std::string original_;

Disk(int size, std::string original) : size_(size), original_(std::move(original)) {}
};

还有 substr 切割字符串要指定起始下标和终止下标,区间不是左闭右闭,而是左闭右开。