1. 程式人生 > >劍指offer面試題5:替換空格(Java 實現)

劍指offer面試題5:替換空格(Java 實現)

題目:
請實現一個函式,將一個字串中的空格替換成“%20”。例如,當字串為We Are Happy.則經過替換之後的字串為We%20Are%20Happy。

測試用例:

  1. 功能測試:輸入的字串包含空格(最前面、中間、最後面、連續多個空格)
  2. 邊界測試:輸入的字串沒有空格。
  3. 負面測試:輸入空指標(空字串、只含一個空格字元、有多個空格字元)

方法一:時間複雜度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);
    }