剑指offer 面试题5:替换空格

面试题5:替换空格

题目描述

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
需要注意的是:空格是一个字符,%20是3个字符,直接替换会导致后面的字符被覆盖

思路1:

创建一个新的字符串变量,遍历源字符串,当遇到空格时,将%20加到新字符串,当不是空格时,直接把字符加到字符串。
时间复杂度为O(n),空间复杂度为O(n),此方法以空间来换时间

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

思路二

从头到尾扫描字符串,当遇到空格后的字符都都后移两个单位,然后把一个空格字符替换成3个字符“%20”,这种方法的时间复杂度为O(n²),空间复杂度为O(1)。
我们发现每遇到一次空格就移动一次位置,那么很多字符都移动了多次位置,那么我们如何减少移动次数
换一种思路,把从前向后替换改为从后向前替换
先遍历一次字符串,统计出空格的数量,那么就知道了替换之后字符串的总长度

public class Solution {
    public String replaceSpace(StringBuffer str) {
        int length=str.length();
    	if(str==null||length==0)
            return str.toString();
        int newLength=0;
        for(int i=0;i<length;i++){
            if(str.charAt(i)==' ')
                newLength++;
        }
        if(newLength==0)//没有空格
            return str.toString();
        newLength=newLength*2+length;
        str.setLength(newLength);
        int newIndex=newLength-1;
        for(int i=length-1;i>=0;i--){
            if(str.charAt(i)==' '){
                str.setCharAt(newIndex--,'0');
                str.setCharAt(newIndex--,'2');
                str.setCharAt(newIndex--,'%');
            }
            else
                str.setCharAt(newIndex--,str.charAt(i));
        }
        return str.toString();
    }
}

该算法时间复杂度为O(n),空间复杂度为O(1)

需要注意的是String数组是不可改动其中的元素的,所以使用java.lang.StringBuffer中的setLength(字符串长度)来改变字符串的长度,使用setCharAt(索引位置,新的字符)来改变某一位置的字符

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值