剑指offer--字符串替换空格

将一个字符串中的空格替换成 "%20"。

Input:
"We Are Happy"

Output:
"We%20Are%20Happy"

这道题第一眼看好简单啊,直接遍历然后替换空格就好了啊, 唯一要注意是参数StringBuffer形式

public class Solution {
    public String replaceSpace(StringBuffer str) {
        String res="";
        for(int i=0;i<str.length();i++){
            if(str.charAt(i)==' ')
                res += "%20";
            else
                res += str.charAt(i);
        }
        return res;
    }
}

看了牛客网答案有的人从后往前做,不明白为什么要复杂化,看了说明,是考虑到在 原字符串上做替换。这样的话从后往前只需要移动一次比较简单。

从前往后替换,后面的字符要不断往后移动,要多次移动,所以效率低下

 从后往前,先计算需要多少空间,然后从后往前移动,则每个字符只为移动一次,这样效率更高一点。

我的答案:要注意从后往前下标从length-1开始

public class Solution {
    public String replaceSpace(StringBuffer str) {
        int space_num = 0;
        int old_length = str.length();
        for(int i=0;i<old_length;i++){
            if(str.charAt(i)==' ')
                space_num++;
        }
        int new_length = old_length+2*space_num;
        int j= new_length-1;
        str.setLength(new_length);
        for(int i=old_length-1;i>=0;i--){//这里别人还加了一个i<=j的条件,但是我觉得不必要
            if(str.charAt(i)==' '){
                str.setCharAt(j--,'0');
                str.setCharAt(j--,'2');
                str.setCharAt(j--,'%');
            }
            else
                str.setCharAt(j--,str.charAt(i));
        }
        return str.toString();
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值