剑指Offer:替换空格

替换空格


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


显然从后往前是最佳C语言式解法,这个纯粹的指针运算。记住在往后迁移后,写入替换字符一定要记住加上偏移距离。


//length为牛客系统规定字符串输出的最大长度,固定为一个常数
class Solution {
public:
    void replaceSpace(char *str,int length) {
        int count=0,len=0;
        char *cur=str;
        for(;*cur!='\0';++cur,++len){
            if(*cur==' ')   ++count;
        }
        if(3*count+len>length)   return;
        int i=len+1;
        while(count&&i>=0){
            int move=2*count;
            for(;*(str+i)!=' '&&i>=0;--i){
                *(str+i+move)=*(str+i);
            }
            *(str+i+move-2)='%';//move表示移动距离!!
            *(str+i+move-1)='2';
            *(str+i+move)='0';
            --i;
            --count;
        }
    }
};

我认为只要题目没有要求,我们可以尽量使用字符串函数。比如java中替换。如@RX的代码。注意其中反斜线的转义。再比如c++中算法:replace(iList.begin(),iList.end(),0,42);表示将迭代器范围内0替换为42;若要保持长度不变可以采用replace_copy(iList.begin(),iList.end(),back_inserter(ivec),0,42)。


public class Solution {
    public String replaceSpace(StringBuffer str) {
        return str.toString().replaceAll("\\s", "%20");
    }
}

2016.9.8更新

参考了书里的代码,发现两个指针写出来比起一个指针写出来要清晰很多。还有应该是+2*count。


//length为牛客系统规定字符串输出的最大长度,固定为一个常数
class Solution {
public:
    void replaceSpace(char *str,int length) {
        if(!str||length<=0) return;
        int count{0},len{0};
        for(char *p=str;*p!='\0';++p,++len){
            if(*p==' ') ++count;
        }
        if(len+2*count>length)  return;
        //两个指针,一个扫描一个指向待写区。注意此处是+2*count
        for(char *behind=str+len+2*count,*cur=str+len;
                                cur!=behind;--cur,--behind){
            //结束条件不能是cur!=str,防止第一个字符为空格,同时对于其他情况可以减少循环
            if(*cur!=' '){
                *behind=*cur;
            }
            else{
                *(behind--)='0';
                *(behind--)='2';
                *(behind)='%';
            }
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值