题目描述
编写一个程序,将输入字符串中的字符按如下规则排序。
规则 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).
不用常规的排序,因为不分大小写,且非字母也不参与排序。
int main()
{
string str;
while(getline(cin,str))
{
vector<char> v;
int i,j;
//关键
for(j=0;j<26;j++)
{
for(i=0;i<str.size();i++)
{
if((str[i]-'a'==j)||(str[i]-'A'==j))
v.push_back(str[i]);
}
}
j=0;
for(i=0;i<str.size();i++)
{
if((str[i]>='a' && str[i]<='z') ||(str[i]>='A' && str[i]<='Z'))//若是字母,输出字母数组中的字符
{
if(v.size()!=0)
{
cout<<v[j];
j++;
}
}
else//若是非字母,直接输出原串中字符
cout<<str[i];
}
cout<<endl;//至关重要,如果没有这一行,在牛客网编译运行会输出很多多余的字符。
}
return 0;
}
另外一种输出写法:测试用例只会通过60%,如下
i=0;j=0;
while(i<str.size() && j<v.size())
{
if((str[i]>='a' && str[i]<='z') ||(str[i]>='A' && str[i]<='Z'))
cout<<v[j++];
else
cout<<str[i];
i++;
}
cout<<endl;
说明:忽略一种情况,就是当字符串本身没有大小写字母时,数组v为空的情况,如当输入‘$’,v.size()==0,不会执行以下操作。
前面的方法是控制输出;我们也可以把v中的元素依次覆盖str字母的位置:
for(i=0,j=0;i<str.size()&&v.size()>0;i++)
{
if((str[i]>='a' && str[i]<='z') ||(str[i]>='A' && str[i]<='Z'))
str[i]=v[j++];
}
cout<<str<<endl;