题目:
请实现一个函数,把字符串 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