面试题5:替换空格

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

方法:从尾到头!思路与课本差不多,设置两个指针p,q,分别指向原数组和扩充后数组的末尾'\0'.

class Solution {
public:
    void replaceSpace(char *str,int length) {
        //length:str数组允许的最大容量,不是str数组的实际长度
        if(str==nullptr||length<=0)
            return;
        int original_length=1;//考虑到数组最后一位是'\0',而在循环中这位不计,所以提前加上1.
        int blank_length=0,i=0;
        //遍历数组,得到数组的实际长度和空格个数
        while(str[i]!='\0')
        {
            original_length++;
            if(str[i]==' ')
                blank_length++;
            i++;
        }
        //替换后的新容量,还得判断他是否<=数组允许的最大容量
        int new_length=original_length+blank_length*2;
        if(new_length>length)
            return;

        char *p=str+original_length-1;//*p指针指向str最后一位,即结束符‘\0’
        char *q=str+new_length-1;//*q指针指向替换后str数组的最后一位
        while(p<q)
        {
            if(*p!=' ')
            {
                *q=*p;
            }       

            else
            {
                *q='0';
                *(q-1)='2';
                *(q-2)='%';
                q=q-2;

            }
            --p;
            --q;
        }
    }
};

有几点需要注意的:

  1. void replaceSpace(char *str,int length)中的length是str数组所能容纳的最大长度,不是现有字符串的长度;

  2. 在遍历字符串时,以while(str[i]!='\0')结束;

  3. 注意多种特殊情况:程序开头验证str是否为空,length是否大于0,中途扩充后的数组长度得小于等于最大容量length;

  4. 当碰到空格时注意*q与p的处理情况,不能如此:

    else
             {
                 *q='0';
                 *q--='2';
                 *q--='%';
             }

    此时就得分清i--与--i的区别,i--先赋值在i=i-1,--i先i=i-1再赋值。程序里q--='2',先赋值q='2',再计算q=q-1,这样的话‘2’就覆盖了‘0’导致错误。

    else
             {
                 *q='0';
                 *(q-1)='2';
                 *(q-2)='%';
                 q=q-2;
    
             }

    还得注意(q-1)='2';(q-2)='%';只是赋值操作,得最后q=q-2将q前移进行赋值操作。
    所以就还有另一种写法:

    while(p<q)
         {
             if(*p!=' ')
             {
                 *q--=*p;
             }       
    
             else
             {
                 *q--='0';//先赋值后减1,刚好满足要求。
                 *q--='2';
                 *q--='%';
    
             }
             --p;
         }
全部评论

相关推荐

10-09 22:05
666 C++
找到工作就狠狠玩CSGO:报联合国演讲,报电子烟设计与制造
点赞 评论 收藏
分享
10-12 19:08
666 C++
花开蝶自来_:技能:听动物叫,让雪豹闭嘴
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务