剑02-—替换空格

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

//java实现
public class Solution {
    public String  replaceSpace(StringBuffer str) {

        if (str.length() == 0)
            return "";

        //计算空格数
        int spaceNum = 0;
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == ' ')
                spaceNum++;
        }
        //在原始字符串中,从后向前替换
        int newLen = str.length() + spaceNum * 2;//替换后字符串的长度
        int oldP = str.length() - 1;//原指针指向原字符串末尾
        int newP = newLen - 1;//新指针指向替换后字符串末尾
        str.setLength(newLen);

        for(;oldP>=0&&oldP<newP;--oldP){
            if(str.charAt(oldP)==' '){
                str.setCharAt(newP--,'0');
                str.setCharAt(newP--,'2');
                str.setCharAt(newP--,'%');
            }
            else{
                str.setCharAt(newP--,str.charAt(oldP));
            }
        }
        return str.toString();


    }
}

思想:
从后往前 移动复制替换
代码思路:
1.判断特殊情况,比如字符串为空或者长度小于0;
2、遍历字符串,求出字符串长度oldLen;
求出空格个数blankNum;
计算出插入%20之后的新字符串的长度newLen;
判断新字符串的长度newLen如果大于给出的数组最大可存储空间length,返回;
3、定义两个指针分别指向旧新字符串数组的末尾pOld,pNew
判断如果str[pOld]==’ ‘为空格,则将%20插入;
否则,逐个将pOld指向的字符复制到pNew指向的位置;
注意:
c++中每个字符串都以字符’\0’结尾,占一个字节;
例如”We Are Happy.”这个字符串长度是14(包括字符’\0’),替换之后字符串总长度为18

//c++实现
class Solution {
public:
    void replaceSpace(char *str,int length)
    {

        if(str==NULL||length<=0)
               return;

        int oldLen;
        int newLen;
        int blankNum;
        int i=0;
        while(str[i]!='\0')//单引号注意
        {
            ++oldLen;
            if(str[i]==' ')
                ++blankNum;
            ++i;//忘记写这个?逗我?
        }
        newLen=oldLen+2*blankNum;

        if(newLen>length)//这个判断条件忘记
            return;

        int pOld=oldLen;
        int pNew=newLen;
        while(pOld>=0&&pNew>pOld)//pOld>=0不要写成pOld>0,不要忘记等号,小细节
        {
            if(str[pOld]==' ')
            {
                str[pNew--]='0';               
                str[pNew--]='2';
                str[pNew--]='%';
            }
            else
            {
                str[pNew--]=str[pOld];
            }
            --pOld;

        }
    }
};

所有的字符都只复制(移动)一次,因此这个算法的时间复杂度为O(n),

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值