剑指 Offer 05. 替换空格

188 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

题目:请实现一个函数,将字符串s中的每个空格替换成%20

示例:

输入:s = "We are happy."
输出:"We%20are%20happy."

解题思路

在做本题之前,首先应该了解在Java中是存在这样的函数的,可以直接将字符串中的对应元素进行替换,例如:

public String replaceSpace2(String s){
    return s.replace(" ", "%20");
}

而本题的目的就是让我们自己实现一个类似这种功能的函数,其实思路也很简单,无非就是遍历字符串,遍历到一个替换一个,返回最终的结果即可,如下代码:

public String replaceSpace(String s){
    StringBuilder sb = new StringBuilder();
    for(int i=0;i<s.length();i++){
        if(s.charAt(i) == ' '){
            sb.append("%20");
        }else {
            sb.append(s.charAt(i));
        }
    }

    return sb.toString();
}

时间复杂度为O(n)O(n)。但上述使用replace最终耗时0ms,而使用replaceAll最终耗时2ms。原因就是replaceAll有一个正则匹配的过程。

Java源码分析

做题不应该局限于此,何况还是这么简单的一题,我们接下来来分析一下在Java中对应的函数是如何实现的!

Java中可以实现此结果的函数有replacereplaceAll

其中在Java11中,replace的思路和我们上面的思路是一样的,都是通过找到匹配字符串的索引之后进行替换执行stringBuilderappend

replaceALL的源码为:

public String replaceAll(String regex, String replacement) {
    return Pattern.compile(regex).matcher(this).replaceAll(replacement);
}

可以发现其调用了 Matcher.replaceAll() 方法,具体代码就不贴了,replaceAll在执行的时候首先会判断待匹配的字符串是否是正则表达式,如果是的话则执行正则表达式的替换,否则就是普通字符串的替换,之后也是用StringBuilder追加字符串。

当然如果我们想用replaceAll但字符串中包含正则表达式字符,我们首先需要对其使用\\转义,之后就可以像字符串一样替换了。

本篇写的可能有问题,欢迎指正。