题目给出了三个要求
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")