题目给出了三个要求
1、前两个规则 只需要对字母进行稳定排序即可。
sort()本身不稳定,要实现稳定排序只需要加一个order来记录字母输入的顺序即可,当字母比对相同,按照order来排序即可。
为了实现方便,不妨定义一个结构体,把字母letter和顺序order放一起,如下所示:
//结构体
struct word {
char letter;
int order;
word(char l, int o): letter(l), order(o) {};
};
//排序算法
bool myCompare(const word& a, const word& b) {
if (tolower(a.letter) == tolower(b.letter)) {
return a.order < b.order;
}
return tolower(a.letter) < tolower(b.letter);
}
2、第三个规则,要求非字母保持原有顺序不变,似乎有点麻烦,但也好处理;
考虑到字母需要排序,我们可以把字母摘出来放到一个vector中,这样就把字母和非字母区分开了。
具体实现方法:定义string类型变量input,用getline(cin,input)获取输入后,遍历input,把里面的字母都摘出来放入一个新的vector中,把字母排序完成后再插入input中即可。
完整代码如下,逻辑很简单:
#include <cctype>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
struct word {
char letter;
int order;
word(char l, int o): letter(l), order(o) {};
};
bool myCompare(const word& a, const word& b) {
if (tolower(a.letter) == tolower(b.letter)) {
return a.order < b.order;
}
return tolower(a.letter) < tolower(b.letter);
}
int main() {
string input; //存储所有输入数据
vector<word>words; //只存储输入数据中的字母
while (getline(cin, input)) {
words.clear();
for (int i = 0; i < input.size(); i++) {
if (isalpha(input[i]) ) { //如果是字母,摘出来放入words中
words.emplace_back(input[i], i);
}
}
sort(words.begin(), words.end(), myCompare);//排序
for (int i = 0, j = 0; i < input.size(); i++) { //i和j分别遍历input和words
if (isalpha(input[i])) {
input[i] = words[j++].letter;
}
}
cout << input << endl;
}
}
// 64 位输出请用 printf("%lld")



京公网安备 11010502036488号