剑指 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");
    }
}

 

posted @ 2023-02-01 13:43  忧愁的chafry  阅读(11)  评论(0编辑  收藏  举报