剑指 Offer 05. 替换空格
题目:
思路:
【1】这道题本身就是简单题,其实只要一次遍历就会满足了,至于辅助空间,其实有的话效率会高一点。而且大多数并不会想知道你怎么解,而是想知道你有多少种解法。优缺点又是什么。
代码展示:
//时间0 ms击败100% //内存39.4 MB击败59.62% class Solution { public String replaceSpace(String s) { StringBuffer buf = new StringBuffer(); for (int i = 0; i < s.length(); i++){ if (s.charAt(i) == ' '){ buf.append("%20"); }else { buf.append(s.charAt(i)); } } return buf.toString(); } } //时间0 ms击败100% //内存39.3 MB击败63.69% //时间复杂度:O(n)。遍历字符串 s 一遍。 //空间复杂度:O(n)。额外创建字符数组,长度为 s 的长度的 3 倍。 //其实用这种本质上和使用StringBuffer差不多,因为StringBuffer,里面就是用的char数组,而且默认大小16,所以相比于上面那种需要扩容,这种一开始就规定了空间大小,不用重复开辟,虽然会有浪费,然后将char数组转成字符串。 class Solution { public String replaceSpace(String s) { int length = s.length(); char[] array = new char[length * 3]; int size = 0; for (int i = 0; i < length; i++) { char c = s.charAt(i); if (c == ' ') { array[size++] = '%'; array[size++] = '2'; array[size++] = '0'; } else { array[size++] = c; } } return new String(array, 0, size); } } //时间6 ms击败3.84% //内存39.9 MB击败6.17% //这种在原本字符串上进行分割形成新的字符串,本身割裂的时候就要采用系统拷贝,其次是会产生大量的无用字符串对象在内存,虽然代码不一定看得出来,但确实存在,所以内存消耗较高,而且分割函数内部其实也有诸多操作,其实时间成本并不低 class Solution { public String replaceSpace(String s) { int len = s.length(); for(int i=0;i<len;i++){ if(s.charAt(i) == ' '){ s = s.substring(0,i)+"%20"+replaceSpace(s.substring(i+1)); } } return s; } } replace和replaceAll的区别: 1) replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharSequence即字符串序列的意思,说白了也就是字符串); 2) replaceAll的参数是regex,即基于规则表达式的替换,比如,可以通过replaceAll("\\d", "*")把一个字符串所有的数字字符都换成星号; //时间0 ms击败100% //内存39.2 MB击败75.95% class Solution { public String replaceSpace(String s) { return s.replace(" ", "%20") ; } } //时间2 ms击败10.91% //内存39.3 MB击败64.20% class Solution { public String replaceSpace(String s) { return s.replaceAll(" ","%20"); } }