/**
* 實作一個函數,把字元串中的每個空格替換成“%20”。
* 通過按傳統辦法,假設字元的長度是n。對每個空格字元,需要移動後面O(n)個字元,是以對含有O(n)個空格字元串而言總的時間效率是O(n2)
* 在前面的分析中,我們發現數組中的很多字元都移動了很多次,能不能減少移動的次數呢?我們換一種思路,把從前向後替換成從後向前替換
* 我們先周遊一次字元串,這樣就能夠統計出字元串中空格的綜述,并可以計算出替換之後字元串的總的長度。
* 每替換一個空格,長度增加2,是以替換以後的字元串的長度等于原來的長度加上2乘以空格的數目
* 我們從字元串的後面開始複制和替換。首先準備兩個指針,P1和P2.(用字元數組代替)
* P1指向原始字元串的末尾,而P2指向替換之後的字元串的末尾。
* 接下來我們向前移動指針P1,逐個把它指向的字元複制到P2指向的位置,直到碰到第一個空格為止。
* 碰到第一個空格之後,把P1向前移動一格,在P2之前插入字元串”%20“,由于”%20“的長度為3,同時也要把P2向前移動3格
* 接着向前複制,直到碰到第二個空格。
* 和上一次一樣,我們再把P1向前移動1格,并把P2向前移動3格插入”%20“,
* 此時P1,P2指向同一個位置,表明所有的空格都已經替換完畢。
*
* @author VicterTian
* @version V1.0
* @Date 2019/1/19
*/
public class P51_ReplaceSpaces {
public static void main(String[] args) {
String str = "We are happy.";
System.out.println("replaceBlank(str) = " + replaceBlank(str));
}
private static String replaceBlank(String str) {
int newLength = str.length();
char[] chars = str.toCharArray();
for (char aChar : chars) {
if (aChar == ' ') {
newLength += 2;
}
}
char[] newStr = new char[newLength];
for (int i = 0; i < chars.length; ++i) {
newStr[i] = chars[i];
}
for (int indexOfOld = str.length() - 1, indexOfNew = newLength - 1; indexOfOld > 0 && indexOfNew != indexOfOld; indexOfOld--, indexOfNew--) {
if (chars[indexOfOld] == ' ') {
newStr[indexOfNew--] = '0';
newStr[indexOfNew--] = '2';
newStr[indexOfNew] = '%';
} else {
newStr[indexOfNew] = newStr[indexOfOld];
}
}
return Arrays.toString(newStr);
}
}