題目描述:請實現一個函數,將一個字符串中的空格替換成“%20”。例如,當字符串爲We Are Happy.則經過替換之後的字符串爲We%20Are%20Happy。
public class Solution {
/*
分析:首先要問字符串替換是在新的字符串上替換還是在原有的字符串上替換
如果是在原有的字符串上替換,那麼關鍵問題如下:
這道題的關鍵在於替換後的字符串長度增加,如果直接替換,那麼空格後
的兩個字符將被“20”這兩個字符覆蓋,因此每次替換一個空格,空格後面的所有
字符都應該向後挪2個字符的位置,這樣從頭到尾的替換,因爲有n個字符,每次
替換都要挪動O(n)個字符,因此時間複雜度是O(n^2);
如果我們從後面開始替換,那麼就不用每次替換,都要挪動O(n)個字符,因此
時間複雜度是O(n)。
要從後面開始複製,就要知道替換後字符串的長度,那麼我們應該先統計替換前
字符串的長度和空格的個數,在Java中,使用str.setLength(lenNew)來使
字符串的長度增大到lenNew。
然後創建兩個指針,分別指向原字符串的尾巴(P1)和新字符串的尾巴(P2),
如果是字母,則P1和P2一起向前移動,如果是空格,則P1向前移動1,P2向前移動3
*/
public String replaceSpace(StringBuffer str) {
//統計原字符串的長度和空格數
int lenOri = str.length();
int BankSpace = 0;
for(int i = 0; i<lenOri ; i++){
if(str.charAt(i) == ' '){
BankSpace++;
}
}
//計算新的字符串長度
int lenNew = lenOri + 2 * BankSpace;
str.setLength(lenNew);
//p1指向原字符串的尾巴,p2指向新字符串的尾巴
int p1 = lenOri-1;
int p2 = lenNew-1;
while(p1 != p2){
if(str.charAt(p1) != ' '){
char c = str.charAt(p1);
str.setCharAt(p2,c);
p1--;
p2--;
}
else{
str.setCharAt(p2,'0');
p2--;
str.setCharAt(p2,'2');
p2--;
str.setCharAt(p2,'%');
p2--;
p1--;
}
}
return str.toString();
}
}