編寫一個程序,將輸入字符串中的字符按如下規則排序。
規則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).
輸出描述:
輸入例子:
A Famous Saying: Much Ado About Nothing (2012/8).輸出例子:
A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).這是一道純字符處理問題,難點在大小寫不區分排序,默認的ASCII碼排序是區分大小寫的,而且相差32,直接排序會使所有小寫字母都排在后面。
而此題要保證:
(1)小寫字母和大寫字母不區分,而且保持原來輸入順序!
(2)非英文字母保持原樣輸出
關鍵問題在于如何保證大小寫字母不區分且保持原來順序,目前能想到的辦法是從a到z依次去string中找,找到一個字母就添加進來:
for(int i=0;i<26;i++){ for(auto c:str_sort){//str_sort為待排字符串 if(c=='a'+i||c=='A'+i) str_temp+=c;//str_temp為排序后的字符串,字母大小寫不區分且保持原序 } }對于第二個問題,可以拷貝一份string副本,非字母字符保持不變,字母字符以'0'替換,將經過上述方法排序過的string替換掉該副本的所有'0'字符即可。完整AC后的代碼:
#include <iostream>#include <string>using namespace std;int main(){ string inStr; while(getline(cin,inStr)){ string str_temp,str_sort,str_res; str_res=inStr; for(auto &e:str_res){ if((e>='a'&&e<='z')||(e>='A'&&e<='Z')){ str_sort+=e; e='0'; } } for(int i=0;i<26;i++){ for(auto c:str_sort){ if(c=='a'+i||c=='A'+i) str_temp+=c; } } int i=0; for(auto &e:str_res){ if(e=='0'){ e=str_temp[i]; i++; } } cout<<str_res<<endl;; } return 0;}
新聞熱點
疑難解答