变化大小写
编写一个程序,将输入字符串中的字符按如下规则排序。
规则 1 :英文字母从 A 到 Z 排列,不区分大小写。
如,输入: Type 输出: epTy
规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。
如,输入: BabA 输出: aABb
规则 3 :非英文字母的其它字符保持原来的位置。
如,输入: By?e 输出: Be?y
样例:
输入:
A Famous Saying: Much Ado About Nothing(2012/8).
输出:
A aaAAbc dFgghh : iimM nNn oooos Sttuuuy (2012/8).
示例1
输入
A Famous Saying: Much Ado About Nothing (2012/8).
输出
A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).
code
- 不要用快排cmp,不稳定
#include <bits/stdc++.h>
using namespace std;
struct Letter
{
char ch;
int num;//越小字母顺序越前
};
bool isLetter(char ch)
{
if(ch>='A'&&ch<='Z')
return true;
if(ch>='a'&&ch<='z')
return true;
return false;
}
string change(string s)
{
vector<Letter> v;
for(int i=0; i<s.size(); ++i){
if(isLetter(s[i])){
Letter tmp;
tmp.ch = s[i];
tmp.num=i;
v.push_back(tmp);
}
}
//sort(v.begin(),v.end(),cmp//快排不稳定
for(int i=0; i<v.size(); ++i){
for(int j=i+1; j<v.size(); ++j){
if(v[i].ch+32==v[j].ch||v[i].ch-32==v[j].ch){
if(v[i].num>v[j].num){
swap(v[i],v[j]);
}
}
else {
char a=v[i].ch;
char b=v[j].ch;
if(a>='a') a-=32;
if(b>='a') b-=32;
if(a>b){
swap(v[i],v[j]);
}
}
}
}
string res;
int j=0;
for(int i=0; i<s.size(); ++i){
if(isLetter(s[i])){
res += v[j++].ch;
}
else {
res += s[i];
}
}
return res;
}
int main()
{
string s;
while(getline(cin, s))
{
cout << change(s) << endl;
}
return 0;
}