华为机试在线训练-牛客网(16)字符串排序


题目描述

编写一个程序,将输入字符串中的字符按如下规则排序。

规则1:英文字母从AZ排列,不区分大小写。

      如,输入:Type 输出:epTy

规则2:同一个英文字母的大小写同时存在时,按照输入顺序排列。

    如,输入:BabA 输出:aABb

规则3:非英文字母的其它字符保持原来的位置。

    如,输入:By?e 输出:Be?y

样例:

    输入:

   A Famous Saying: Much Ado About Nothing(2012/8).

    输出:

   A aaAAbc dFgghhiimM nNn oooos Sttuuuy (2012/8).



输入描述:



输出描述:


输入例子:
A Famous Saying: Much Ado About Nothing (2012/8).

输出例子:
A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).

这是一道纯字符处理问题,难点在大小写不区分排序,默认的ASCII码排序是区分大小写的,而且相差32,直接排序会使所有小写字母都排在后面。

而此题要保证:

(1)小写字母和大写字母不区分,而且保持原来输入顺序!

(2)非英文字母保持原样输出

关键问题在于如何保证大小写字母不区分且保持原来顺序,目前能想到的办法是从a到z依次去string中找,找到一个字母就添加进来:

        for(int i=0;i<26;i++){
            for(auto c:str_sort){//str_sort为待排字符串
                if(c=='a'+i||c=='A'+i)
                    str_temp+=c;//str_temp为排序后的字符串,字母大小写不区分且保持原序
            }
        }
对于第二个问题,可以拷贝一份string副本,非字母字符保持不变,字母字符以'0'替换,将经过上述方法排序过的string替换掉该副本的所有'0'字符即可。


完整AC后的代码:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string inStr;
    while(getline(cin,inStr)){
        string str_temp,str_sort,str_res;
        str_res=inStr;
        for(auto &e:str_res){
            if((e>='a'&&e<='z')||(e>='A'&&e<='Z')){
                str_sort+=e;
                e='0';
            }
        }
        for(int i=0;i<26;i++){
            for(auto c:str_sort){
                if(c=='a'+i||c=='A'+i)
                    str_temp+=c;
            }
        }
        int i=0;
        for(auto &e:str_res){
            if(e=='0'){
               e=str_temp[i];
               i++;
            }
        }
        cout<<str_res<<endl;;
    }
    return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ctrlturtle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值