剑指02.替换空格

题目描述

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
 

思路:

解法一:调用自带函数str.toString().replace(" ","%20")。

解法二:在当前字符串上进行替换。

  1. 先计算替换后的字符串需要多大的空间,并对原字符串空间进行扩容;
  2. 从后往前替换字符串的话,所有的字符都只复制(移动)一次,时间复杂度是O(n);
  3. 如果从前往后替换,每个字符串需要多次移动,效率较低。

解法三:开辟一个新的字符串。当遇到 " ",就追加 "%20",否则遇到什么追加什么。

 

总结:  在合并两个数组(包括字符串)时,如果从前往后复制每个数字(或字符)则需要重复移动数字(或字符)多次,那么可以考虑从后往前复制,这样就能减少移动的次数,从而提高效率。

解法一

public class Solution {
    public String replaceSpace(StringBuffer str) {
        return str.toString().replace(" ","%20");      
    }
}

解法二

public class Solution {
    public String replaceSpace(StringBuffer str) {
        //originalLength为字符串的实际长度
        int originalLength = str.length();
        int spaceNum = 0;
        for (int i = 0; i < str.length(); i++){
            if (str.charAt(i) == ' '){
                spaceNum++;
            }
        }
        //newLength为把空格替换成'%20'之后的长度
        int newLength = originalLength + spaceNum * 2;
        str.setLength(newLength);  //对StringBuffer扩容!!
        int indexOfOriginal = originalLength - 1;
        int indexOfNew = newLength - 1;
        while (indexOfOriginal >= 0 && indexOfNew > indexOfOriginal){
            if (str.charAt(indexOfOriginal) == ' '){
                str.setCharAt(indexOfNew--, '0'); //注意setCharAt与insert的区别,insert对该位置及之后的元素向后平移,然后插入新元素。
                str.setCharAt(indexOfNew--, '2');
                str.setCharAt(indexOfNew--, '%');
            }else{
                str.setCharAt(indexOfNew--,str.charAt(indexOfOriginal));
            }
            indexOfOriginal --;
        }
        return str.toString();
    }
}

解法三

public class Solution {
    public String replaceSpace(StringBuffer str) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < str.length(); i++){
            if (str.charAt(i) == ' '){
                sb.append("%20");
            }else{
                sb.append(str.charAt(i));
            }
        }
        return sb.toString();
    }
}

 

知识点扩展——StringBuffer常用方法

public class StringBufferBuilderTest {
    public static void main(String[] args) {
        StringBuffer sf=new StringBuffer();
//        用于字符串拼接
        sf.append("ab");
        sf.append(25);
        System.out.println(sf);
//        删除指定位置的内容 [start,end)
        sf.delete(4,6);
        System.out.println(sf);
//        把[start,end)位置替换为str
        sf.replace(1,3,"we");
        System.out.println(sf);
//        在指定位置插入数据
        sf.insert(2,"xxx");
        System.out.println(sf);
//        截取[start,end)字符串
        System.out.println(sf.substring(1,5));
//        返回字符串长度
        System.out.println(sf.length());
//        获取索引为1的字符
        System.out.println(sf.charAt(1));
//        将索引为1处的值替换为'm'
    sf.setCharAt(1,'m');
        System.out.println(sf);
//        将字符串翻转
        System.out.println(sf.reverse());
    }
}

 

 

posted @ 2020-08-03 09:40  不学无墅_NKer  阅读(128)  评论(0编辑  收藏  举报