題目描述
編寫一個程序,將輸入字符串中的字符按如下規則排序。
規則 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;