#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
//编写一个程序,将输入字符串中的字符按如下规则排序。
//规则 1 :英文字母从 A 到 Z 排列,不区分大小写。如,输入: Type 输出: epTy
//规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。
//如,输入: BabA 输出: aABb
//规则 3 :非英文字母的其它字符保持原来的位置。
//如,输入: By?e 输出: Be?y
//大写字母:65-90 小写字母:97-122
int main()
{
string str;
//cin>>str;//会报错 只输出A
getline(cin,str);
int len = str.length();
vector <char> vec; //用一个 char 型的向量存储按规则排序后的字符串中的字母字符
//规则一:英文字母从 A 到 Z 排列,不区分大小写。
//规则二:同一个英文字母的大小写同时存在时,按照输入顺序排列。
for (int j = 0; j < 26; j++)
{
for (int i = 0; i < len; i++)
{
if ((str[i] - 'a' == j) || (str[i] - 'A' == j))
{
vec.push_back(str[i]); //将符合规则的字母字符先后写入向量
}
}
}
//规则三:非英文字母的其它字符保持原来的位置。
for(int i = 0,k = 0;(i < len) && (k < vec.size()); i++)
{
if((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z'))
{
str[i] = vec[k++];//若是字母,则存入字符串
}
// if(isalpha(str[i]))//判断是否为字母
// {
// str[i] = vec[k++];
// }
}
cout<<str<<endl;
return 0;
}
解法2
// #include <iostream>
// using namespace std;
// int main(){
// string str;
// char out[1000];
// int k = 0;
// getline(cin, str);
// for(int i = 0; i < 26; ++i)
// for(int j = 0; j < str.size(); ++j)
// if(str[j]-'a'==i || str[j]-'A'==i)
// out[k++] = str[j];
// k = 0;
// for(int i = 0; i < str.size(); ++i)
// if(isalpha(str[i]))
// str[i] = out[k++];
// cout << str;
// }