请实现一个函数,将一个字符串中的每个空格替换成“%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;
        }
    }
};有几点需要注意的:
void replaceSpace(char *str,int length)中的length是str数组所能容纳的最大长度,不是现有字符串的长度;
在遍历字符串时,以while(str[i]!='\0')结束;
注意多种特殊情况:程序开头验证str是否为空,length是否大于0,中途扩充后的数组长度得小于等于最大容量length;
当碰到空格时注意*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; }

京公网安备 11010502036488号