華爲機試-字符串排序

題目描述
編寫一個程序,將輸入字符串中的字符按如下規則排序。
規則 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;
發佈了56 篇原創文章 · 獲贊 12 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章