剑指offer:替换空格

题目描述

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

分析:

如果题目允许我们建立新的数组,那只需从头开始扫描原数组中的每个字符,
1)若字符非空格则复制字符到新数组中,
2)若字符为空格则在新数组中填充“%”,“2”,”0”三个字符,
3)继续扫描重复以上操作。

但是题目有空间限制,不允许建立新的数组,只能在原数组上进行操作。所以我们有两种扫描方式:

①从左向右扫描:每当遇到空格,就对其做替换,然后把空格后面的字符往后移动2位。但是这样,每次遇到空格,其后面的字符都要做新一轮的移位,时间复杂度为o(n*n),所以这种方法不是很可取。

②从右向左扫描:需要操作以下步骤:

a.统计字符串中空格的个数,并根据空格数计算出替换后字符串总长度。

b.用两个指针指向原字符串最右端和替换后的新字符串的最右端,从右向左遍历原字符串数组,如果不是空格,则直接将该字符赋给新的字符串,且两个字符串数组的指针都向前移动一位。如果遇到空格,则将“%20”插入到新字符串指针的前3个位置,新字符串指针向左移动三位,原指针向左移动一位。

具体可以参考这两篇博客:

https://blog.youkuaiyun.com/l_xrui/article/details/51685552https://blog.youkuaiyun.com/libaqiangdeliba/article/details/51540871

代码:

public class Solution {
    public String replaceSpace(StringBuffer str) {
        //原字符串下标
        int oldIndex=str.length()-1;
    	int blank=0;
        for(char c:str.toString().toCharArray()){
            if(c==' '){
                blank++;
            }
        }
        //新字符串长度
        int newLen=str.length()+blank*2;
        str.setLength(newLen);
        //新下标
        int newIndex=newLen-1;
        while(oldIndex>0||newIndex>oldIndex){
            if(str.charAt(oldIndex)==' '){
                str.setCharAt(newIndex--,'0');
                str.setCharAt(newIndex--,'2');
                str.setCharAt(newIndex--,'%');
            }else{
                str.setCharAt(newIndex--,str.charAt(oldIndex));
            }
            oldIndex--;
        }
        return str.toString();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值