字符串排序问题
?
題目描述:編寫一個程序,將輸入字符串中的字符按如下規則排序。
規則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).
#include<iostream>
#include<string>
using namespace std;int main(){int len,count=0;string line;while(cin >> line){ //輸入字符中可能空格,考慮多個輸入len = line.size();for(int i = 0; i<len; i++){ //確定字符串中字符個數if((line[i]>='a'&&line[i]<='z')||(line[i]>='A'&&line[i]<='Z')){count++;}}string str(count,'0'); //初始化字儲對象int k=0;for(int i = 0; i<len; i++){ //將提取出來的字母復制到存儲對象中if((line[i]>='a'&&line[i]<='z')||(line[i]>='A'&&line[i]<='Z')){str[k]=line[i];k++;}}k=0;string temp(count,'0'); //初始化排序存儲數組for(int i = 0; i<26; i++){ //對提取的字母進行排序,按照與首字母的差值逐個提取順序位置上的字母進行比較for(int j = 0; j<count; j++){if(str[j]-'a'==i||str[j]-'A'==i){temp[k] = str[j];k++;}}}k=0;for(int i=0;i<len;++i){ //將排序后的字母重寫到提取位置if((line[i]>='a'&&line[i]<='z')||(line[i]>='A'&&line[i]<='Z')){line[i]=temp[k];k++;}}cout << line;}cout << endl;return 0;
}
這道編程題的難點在于不區分大小寫進行排序,此處以遍歷字符與首字符的差值進行挑選,用“||”運算屏蔽大小寫對于排序的影響,這樣的排序方法也有缺陷,那就是每一輪都需要遍歷所有字符,一共需要遍歷26輪,算法的時間復雜度比較高。編譯和調試結果:
總結
- 上一篇: 字符串去重、统计不同字符种类数问题
- 下一篇: 24、25岁的姑娘应该用什么护肤品啊?[