劍指offer面試題5:替換空格(Java 實現)
阿新 • • 發佈:2019-01-05
題目:
請實現一個函式,將一個字串中的空格替換成“%20”。例如,當字串為We Are Happy.則經過替換之後的字串為We%20Are%20Happy。
測試用例:
- 功能測試:輸入的字串包含空格(最前面、中間、最後面、連續多個空格)
- 邊界測試:輸入的字串沒有空格。
- 負面測試:輸入空指標(空字串、只含一個空格字元、有多個空格字元)
方法一:時間複雜度O(n²)
直接從頭到尾掃描字串,當遇到空格的時候就進行替換。由於是把一個字元替換成兩個字元,所以每次都必須把後面所有的字元都後移兩個字元。假設字串的長度為n,對每個空格都需要移動後面O(n)個字元,所以對於O(n)個空格來說時間複雜度就是O(n²)
方法二:時間複雜度O(n)
從尾到頭複製字串,每一個字元都只需要移動一次,所以時間複雜度為(n)。首先從頭到尾掃描字串,計算出空格個數,然後通過空格個數計算出替換後字串的長度。定義兩個指標分別指向新舊字串的末尾,把舊字串的長度擴大到替換後的新字串長度,防止下標越界。然後oldindex向前移動,從後往前複製字串,當遇到空格的時候就就直接替換成對應的字元。
public class test_five { public String replaceSpace(StringBuffer str){ if(str == null)return null; int length = str.length(); //從頭到尾掃描字串,計算出空格個數 int spacenumber = 0; for(int i=0;i<str.length();i++){ if(str.charAt(i) == ' '){ spacenumber++; } } //通過空格個數計算出替換後字串的長度 int newlength = length + spacenumber*2; //定義兩個指標分別指向新舊字串的末尾 int oldindex = length-1; int newindex = newlength-1; //把str的長度擴大到替換後的新字串長度,防止下標越界 str.setLength(newlength); //從後往前複製字串 for(;oldindex>=0 && oldindex<newlength;oldindex--){ //oldindex向前移動遇到空格 if(str.charAt(oldindex) == ' '){ str.setCharAt(newindex--, '0'); str.setCharAt(newindex--, '2'); str.setCharAt(newindex--, '%'); }else{ str.setCharAt(newindex--, str.charAt(oldindex)); } } return str.toString(); } }
方法三:需要額外的空間,利用字串構造器複製到另外一個容器中
public String replaceSpace(StringBuffer str) { if (str == null) return null; StringBuilder sb = new StringBuilder(); for (int i = 0; i < str.length(); i++) { if (String.valueOf(str.charAt(i)).equals(" ")) { sb.append("%20"); }else { sb.append(str.charAt(i)); } } return String.valueOf(sb); }