题目:
编写一个程序,将输入字符串中的字符按如下规则排序。
- 规则 1:英文字母从 A 到 Z 排列,不区分大小写。如,输入:
Type
输出:epTy
。 - 规则 2:同一个英文字母的大小写同时存在时,按照输入顺序排列。如,输入:
BabA
输出:aABb
。 - 规则 3:非英文字母的其它字符保持原来的位置。如,输入:
By?e
输出:Be?y
。
输入格式
输入包含多组测试数据。
每组数据占一行,包含一个字符串。
输出格式
每组数据输出一行结果,为按要求排序后的字符串。
数据范围
字符串长度不超过 1000,
每个输入最多包含 100 组数据。
输入样例:
A Famous Saying: Much Ado About Nothing (2012/8).
输出样例:
A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
string str;
while(getline(cin, str))//输入字符串
{
string cs;
for(auto c : str)
if(isalpha(c)) // 如果该字符为字母则加入到该字符串中
cs += c;
stable_sort(cs.begin(), cs.end(), [](char a,char b){
return tolower(a) < tolower(b);
}); // 稳定排序,且将字母都看做是小写的,不会因字母本身的大小写而改变排序的顺序
for(int i = 0, j = 0; i < str.size(); i ++ ) //输出排序后的字符串
{
if(isalpha(str[i])) cout << cs[j ++ ];
else cout << str[i];
}
cout << endl;
}
return 0;
}
小总结:题解运用到了函数库里的函数,从而简洁地解决了问题,通过这道题学到了一个稳定排序的函数方法,以及如何自定义比较函数。