<!-- lang: java --> package codinginterview; /** * 寫一個函數,把字符串中全部的空格替換爲%20 。 * 分析: * 先遍歷一次字符串,獲得空格個數,進而獲得將空格轉換成%20後的串長度 (每一個空格替換爲%20須要增長2個字符,x個空格增長2x個字符)。 * 而後從後向前依次對空格進行替換,非空格原樣拷貝。 * 若是原串有足夠大的空間, 則替換過程直接在原串上進行, 由於從後向前替換的過程當中,新串用到的空間必定是舊串不須要的空間; * 若是原串的空間不夠大,或是就直接是字符串長度,那麼就新開一個串來保存替換後的結果. * @author mingdong.cheng * */ public class ReplaceStr { /** * 新開一個數組來保存替換後的結果 * O(n) * @param s * @return */ public static String replace(String s) { if (s == null || s.length() == 0) return s; final char[] c = s.toCharArray(); int len = c.length; int count = 0; for (int i=0;i<len;i++) { if (c[i]==' ') { ++count; } } //新開一個數組來保存替換後的結果 //每一個空格替換爲%20後須要增長2個字符,count個空格增長2*count個字符 final char[] d = new char[len+2*count]; int idx=0; for (int i=0;i<len;i++) { if (c[i]==' ') { d[idx]='%'; d[idx+1]='2'; d[idx+2]='0'; idx += 3; } else { d[idx]=c[i]; idx++; } } return String.valueOf(d); } public static String replace2(String s) { if (s == null || s.length() == 0) return s; int len=s.length(); int count = 0; //統計空格個數 for (int i=0;i<len;i++) { if (s.charAt(i)==' ') { ++count; } } //將原字符串擴容 for(int i=0;i<2*count;i++){ s=s.concat("\0"); } //擴容後,原串就會有足夠大的空間;替換可直接在原串上進行; //從後向前依次對空格進行替換,非空格原樣拷貝; //由於從後向前替換的過程當中,新串用到的空間必定是舊串不須要的空間 final char[] c = s.toCharArray(); int idx=len-1+2*count; for (int i=len-1; i>=0; i--) { if (c[i] == ' ') { c[idx] = '0'; c[idx-1] = '2'; c[idx-2] = '%'; idx -= 3; } else { c[idx] = c[i]; idx--; } } return String.valueOf(c); } public static void main(String[] args) { String s = " i am danielcheng . i am coding ... "; System.out.println(replace(s)); System.out.println(replace2(s)); } }