本题的重点在于如何实现三个规则的处理。首先对于规则1和规则2,可以利用一个从0至25的for循环依次判断字符串中是否存在字符A-Z,依次实现了字母从A到Z的排序;同时由于遍历字符串的时候是从前往后,自然实现了按照输入顺序排序。最后对于规则三,由于事先已经将排好序的字母存放起来了,对于源字符串来说,直接将字母位替换为排好序的字母即可,其他位置的字符不变。
#include <string>
#include <iostream>
#include <vector>
using namespace std;
int main() {
string s;
getline(cin, s, '\n');
vector<char> vec;
// 解决规则1和规则2
for (int i = 0; i < 26; i++) {
// i从A开始遍历,相当于实现了从A到Z的遍历
for (int j = 0; j < s.size(); j++) {
// 从头开始取字符串,相当于实现了按输入顺序排序
if (s[j] - 'a' == i || s[j] - 'A' == i) {
// 依次寻找字符串中是否有26个字母
vec.push_back(s[j]);
}
}
}
int k = 0;
for (int j = 0; j < s.size(); j++) {
if ((s[j] >= 'a' && s[j] <= 'z') || (s[j] >= 'A' && s[j] <= 'Z')) {
s[j] = vec[k++];
}
}
cout << s << endl;
return 0;
}