編寫一個(gè)程序,將輸入字符串中的字符按如下規(guī)則排序。
規(guī)則1:英文字母從A到Z排列,不區(qū)分大小寫。
如,輸入:Type 輸出:epTy
規(guī)則2:同一個(gè)英文字母的大小寫同時(shí)存在時(shí),按照輸入順序排列。
如,輸入:BabA 輸出:aABb
規(guī)則3:非英文字母的其它字符保持原來(lái)的位置。
如,輸入: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).這是一道純字符處理問(wèn)題,難點(diǎn)在大小寫不區(qū)分排序,默認(rèn)的ASCII碼排序是區(qū)分大小寫的,而且相差32,直接排序會(huì)使所有小寫字母都排在后面。
而此題要保證:
(1)小寫字母和大寫字母不區(qū)分,而且保持原來(lái)輸入順序!
(2)非英文字母保持原樣輸出
關(guān)鍵問(wèn)題在于如何保證大小寫字母不區(qū)分且保持原來(lái)順序,目前能想到的辦法是從a到z依次去string中找,找到一個(gè)字母就添加進(jìn)來(lái):
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為排序后的字符串,字母大小寫不區(qū)分且保持原序 } }對(duì)于第二個(gè)問(wèn)題,可以拷貝一份string副本,非字母字符保持不變,字母字符以'0'替換,將經(jīng)過(guò)上述方法排序過(guò)的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;}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注