目錄
題目:
請實現一個函數,把字符串中的每個空格替換成”%20“,例如,輸入“We are happy.”,則輸出“We%20are%20happy.”。思路:
我們可以先遍歷一次字符串,這樣就能統計出字符串中空格的總數,並可以由此計算出替換之後的字符串的總長度。每替換一個空格,長度增加2,因此替換以後字符串的長度等於原來的長度加上2乘以空格數目。步驟:
1.我們從字符串的後面開始複製和替換。首先準備兩個指針:P1和P2。P1指向原始字符串的末尾,而P2指向替換之後的字符串的末尾。2.接下來我們向前移動指針P1,逐個把它指向的字符複製到P2指向的位置,直到碰到第一個空格爲止。把P1向前移動1格,在P2之前插入字符串”%20“。由於”%20“的長度爲3,同時也要把P2向前移動3格。
3.我們接着向前複製,直到碰到第二個空格。和上一次一樣,我們再把P1向前移動1格,並把P2向前移動3格插入”%20“。此時P1和P2指向同一位置,表明所有的空格都已經替換完畢。
代碼:
package test;
public class ReplaceBlank {
public static void main(String[] args) {
System.out.println(replaceBlank(new StringBuilder("We are happy.")));
}
public static String replaceBlank(StringBuilder sb) {
//1.如果輸入的字符串爲null,則直接返回
if(sb == null)
return null;
//2.計算出空格數量
int numberOfBlank = 0;
for (int i = 0; i < sb.length(); i++) {
if(sb.charAt(i) == ' ')
++numberOfBlank;
}
//3.計算新字符串的長度
int originalLength = sb.length();
int newLength = originalLength + numberOfBlank * 2;
int indexOfOriginal = originalLength - 1;
int indexOfNew = newLength - 1;
sb.setLength(newLength);
//4.進行空格替換
while(indexOfOriginal >= 0 && indexOfNew > indexOfOriginal) {
if(sb.charAt(indexOfOriginal) == ' ') {
sb.setCharAt(indexOfNew--, '0');
sb.setCharAt(indexOfNew--, '2');
sb.setCharAt(indexOfNew--, '%');
} else {
sb.setCharAt(indexOfNew--, sb.charAt(indexOfOriginal));
}
--indexOfOriginal;
}
return sb.toString();
}
}
注:該算法的時間複雜度爲O(n)