1. 程式人生 > 實用技巧 >劍指02.替換空格

劍指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());
    }
}