美文网首页
替换空格

替换空格

作者: 囧略囧 | 来源:发表于2019-06-22 16:14 被阅读0次

题目描述

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

这道题目如果使用库函数将很简单

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

但是这种写法只适合平时工作,面试并不推荐,面试考察的一般不是使用轮子的能力。
下面我们来看看怎么造这个轮子~

方法一:

还是老套路,牺牲空间换时间

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

时间复杂度O(N),空间复杂度O(N)

方法二:

还是我们的老朋友,牺牲时间换空间。
通常的思路下,我们会构造一个循环,从头开始遍历数组,循环里套一个循环,用来将扫描到的空格之后的元素后移,便于插入“%20”。这样的时间复杂度为O(N^2)。由于代码比较简单这里就不再列出。这种方法的缺点是很容易超时,因为时间特性确实很差。

方法三:

那么有没有既有较好的空间复杂度同时又保证了时间复杂的算法呢?
其实方法二之所以时间特性很差,是因为存在很多重复移动,有的元素在遇到第一个空格时被后移了,在遇到第二个空格时仍要被后移。那么突破点就在这里,有没有办法减少重复计算呢?我们发现,重复计算的数量与空格数量密切相关,那么我们只需要获得空格总数,便得到了最终的数组长度。这时候从后往前扫描,将每个字符移动到自己对应的位置,每个字符仅需要移动一次便实现了我们的要求。(若从前往后扫描则又陷入了重复计算的坑)

public class Solution {
    public String replaceSpace(StringBuffer str) {
        int spacenum = 0;//spacenum为计算空格数
        for(int i=0;i<str.length();i++){
            if(str.charAt(i)==' ')
                spacenum++;
        }
        int indexold = str.length()-1; //indexold为为替换前的str下标
        int newlength = str.length() + spacenum*2;//计算空格转换成%20之后的str长度
        int indexnew = newlength-1;//indexold为为把空格替换为%20后的str下标
        str.setLength(newlength);//使str的长度扩大到转换成%20之后的长度,防止下标越界
        for(;indexold>=0 && indexold<newlength;--indexold){  
                if(str.charAt(indexold) == ' '){  //
                str.setCharAt(indexnew--, '0');
                str.setCharAt(indexnew--, '2');
                str.setCharAt(indexnew--, '%');
                }else{
                    str.setCharAt(indexnew--, str.charAt(indexold));
                }
        }
        return str.toString();
    }
}

时间复杂度O(N),空间复杂度O(1)

相关文章

  • 替换空格

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

  • 空格替换

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

  • 替换空格

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

  • 空格替换

    空格替换设计一种方法,将一个字符串中的所有空格替换成 %20 。你可以假设该字符串有足够的空间来加入新的字符,且你...

  • 替换空格

    《剑指offer》面试题5:替换空格 题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如,输入“we...

  • 替换空格

    ?环境:牛客的编译环境?语言:JavaScript☕️难点:string的replace方法在不使用正则匹配的情况...

  • 替换空格

    https://www.nowcoder.com/practice/4060ac7e3e404ad1a894ef3...

  • 替换空格

    题目描述:请实现一个函数,把字符串中的每个空格替换成"%20"。 样例输入:"We are happy."样例输出...

  • 空格替换

    一、题目 请编写一个方法,输入一个字符串,经过一定的处理将字符串中的“空格”替换为“%20”并返回; 二、示例 输...

  • 替换空格

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

网友评论

      本文标题:替换空格

      本文链接:https://www.haomeiwen.com/subject/ctlvqctx.html