劍指02.替換空格
阿新 • • 發佈:2020-08-03
題目描述
請實現一個函式,將一個字串中的每個空格替換成“%20”。例如,當字串為We Are Happy.則經過替換之後的字串為We%20Are%20Happy。思路:
解法一:呼叫自帶函式str.toString().replace(" ","%20")。
解法二:在當前字串上進行替換。
- 先計算替換後的字串需要多大的空間,並對原字串空間進行擴容;
- 從後往前替換字串的話,所有的字元都只複製(移動)一次,時間複雜度是O(n);
- 如果從前往後替換,每個字串需要多次移動,效率較低。
解法三:開闢一個新的字串。當遇到 " ",就追加 "%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擴容!! intindexOfOriginal = 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()); } }