计算机考研复试真题 字符串排序
题目描述
编写一个程序,将输入字符串中的字符按如下规则排序(一个测试用例可能包含多组数据,请注意处理)。
规则 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).
/* 解题思路:常见考法,将每个元素包含两个信息。可以将每个字符设置一个字符位和一个标志位,将输入的字符串存取到向量中, 存的过程中如果字符是字母则字符位不填充,留着输出时填充,并置标志位为0;如果字符不是字母则字符位填充,并置标志位为1。 排序是用2个for循环,外层for循环按字母顺序排序,内层for循环按输出顺序排序。再向结果向量中填充时,若标志位为1则不填充, 下标直接往后移。若标志位为0则填充,然后下标往后移。最后输出即可。 */ #include<iostream> #include<string> #include<vector> using namespace std; class Node{ //每个元素包含的信息 public: char ch; //字符位 int flag; //标志位 }; int main(){ vector<Node>result(1024); //存放字符 string str; while(getline(cin,str)){ //getline(cin,str)是为了读入一行 int len=str.size(); for(int i=0;i<len;++i){ if( (str[i]<='z'&&str[i]>='a') || (str[i]<='Z'&&str[i]>='A') ) //如果是字母 result[i].flag=0; else{ result[i].flag=1; result[i].ch=str[i]; } } int index=0; for(int i='A';i<='Z';++i) for(int j=0;j<len;++j){ if(str[j]==i||str[j]==i+32){ while(result[index].flag==1) //如果不是字母 ++index; result[index].ch=str[j]; result[index].flag=1; } } for(int i=0;i<len;++i) cout<<result[i].ch; cout<<endl; } return 0; }