标签:
编写一个程序,将输入字符串中的字符按如下规则排序。
规则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).
思路:这题我的思路是先将字符串中的字母都取出来,放到另外一个string中,然后在这个string中进行排序,
再将排好序的字符赋值给之前那个string中,覆盖掉对应的那些字母。
这其中由于字母不区分大小写,而且相同的要按之前的·顺序,我开始用冒泡做,结果发现错了
之后就想到用查找再插入的方法,遍历26遍,从a到z,依次找出后尾部插入到一个字符串中。
下面是AC的代码
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 void sorted2(string &str) 6 { 7 string str1; 8 int len=str.size(); 9 for(int i=0;i<26;i++) 10 { 11 for(int j=0;j<len;j++) 12 if(str[j]==(‘A‘+i)||str[j]==(‘a‘+i)) 13 str1.push_back(str[j]); 14 } 15 str=str1; 16 } 17 /* 18 void sorted(string &str) 19 { 20 if(str.empty()) 21 return; 22 int len=str.size(); 23 if(str.size()==1) 24 return; 25 for(int i=0;i<len-1;i++) 26 { 27 for(int j=i+1;j<len;j++) 28 { 29 char a,b; 30 if(str[i]>=‘a‘&&str[i]<=‘z‘) 31 a=str[i]-32; 32 else 33 a=str[i]; 34 if(str[j]>=‘a‘&&str[i]<=‘z‘) 35 b=str[j]-32; 36 else 37 b=str[j]; 38 39 if(a>b) 40 { 41 char temp; 42 temp=str[i]; 43 str[i]=str[j]; 44 str[j]=temp; 45 } 46 } 47 } 48 return; 49 } 50 */ 51 void ChangeWord(string &str) 52 { 53 if(str.empty()||str.size()==1) 54 return; 55 string str1; 56 for(string::iterator iter=str.begin();iter!=str.end();iter++) 57 { 58 if(((*iter)>=‘A‘&&(*iter)<=‘Z‘)||((*iter)>=‘a‘&&(*iter)<=‘z‘)) 59 str1.push_back(*iter); 60 } 61 sorted2(str1); 62 63 int j=0; 64 for(string::iterator i=str.begin();i!=str.end();i++) 65 if((*i>=‘A‘&&*i<=‘Z‘)||(*i>=‘a‘&&*i<=‘z‘)) 66 { 67 *i=str1[j]; 68 j++; 69 } 70 return; 71 } 72 73 int main() 74 { 75 string str;//="A Famous Saying: Much Ado About Nothing"; 76 getline(cin,str); 77 ChangeWord(str); 78 cout<<str<<endl; 79 80 //system("pause"); 81 }
标签:
原文地址:http://www.cnblogs.com/yanliang12138/p/4734919.html