【剑指Offer1】替换空格

题目:

请实现一个函数,把字符串 s 中的每个空格替换成"%20"

 

思路:

首先排除s.replace(" ", "%20"),纯纯耍流氓。

就是考虑replace函数的底层实现,由于replace是支持正则表达式的(估计很多人不知道,我也是偶然得知),实际底层实现复杂的多,这里我只需要实现替换空格即可。

String转成char数组后遍历,遇到空格,则将其替换成“%20”,有一个小坑在于,空格占1个char,而需要替换的内容有3个char,所以不能遍历用数组下标替换,只能在空格处将字符串分开,中间加上“%20”。

代码如下:

class Solution {
    public String replaceSpace(String s) {
        for (int i=0; i<s.length(); i++) {
            if (s.charAt(i)==' ') {
                String left = s.substring(0, i);
                String right = s.substring(i + 1);
                s = left + "%20" + right;
            }
        }
        return s;
    }
}

 

虽然简单,但是浪费了很多性能。

就是因为String的特性,String是不可变的,当对String内容更改的时候,String是去常量池里找是否存在该字符串,如果不存在直接创建一个新的放到常量池然后返回。

在我这个代码里,等于每次遇到空格都要new三个String,还要反复访问常量池,特别的浪费。

因此就有了用StringBuilder直接构建代替new操作的想法,代码如下:

class Solution {
    public static final String res="%20";
    public String replaceSpace(String s) {
        StringBuilder builder = new StringBuilder();
        char[] ch = s.toCharArray();
        for(char c: ch){
            if (c == ' ') {
                builder.append(res);
            } else {
                builder.append(c);
            }
        }
        return builder.toString();
    }
}

 

总结:

开发的时候偷懒,就凑合用string习惯了,一做题就体现出效率的差别,以后还是应该注意,经常改变的字符串,应使用StringBuilder

 

上一篇:post请求上传文件


下一篇:同时使用@Data和@Builder导致无参构造丢失