天天看點

劍指offer第二版-5替換空格

/**
 * 實作一個函數,把字元串中的每個空格替換成“%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);
  }
}