題目描述:
請實現一個函數,將一個字符串中的每個空格替換成“%20”。例如,當字符串為We Are Happy.則經過替換之后的字符串為We%20Are%20Happy。
解題思路:
對於這個題目,我們首先想到原來的一個空格替換為三個字符,字符串長度會增加,因此,存在以下兩種不同的情況:(1)允許創建新的字符串來完成替換。(2)不允許創建新的字符串,在原地完成替換。
第一種情況比較簡單。對於第二種情況,有以下兩種解法:
- 時間復雜度為O(n^2)的解法。
從頭到尾遍歷字符串,當遇到空格時,后面所有的字符都后移2個。 - 時間復雜度為O(n)的解法。
可以先遍歷一次字符串,這樣可以統計出字符串中空格的總數,由此計算出替換之后字符串的長度,每替換一個空格,長度增加2,即替換之后的字符串長度為原來的長度+2*空格數目。接下來從字符串的尾部開始復制和替換,用兩個指針P1和P2分別指向原始字符串和新字符串的末尾,然后向前移動P1,若指向的不是空格,則將其復制到P2位置,P2向前一步;若P1指向的是空格,則P1向前一步,P2之前插入%20,P2向前三步。這樣,便可以完成替換,時間復雜度為O(n)。
舉例:

編程實現(Java):
//第一種情況:創建新的字符串實現:
public String replaceSpace(StringBuffer str) {
String res="";
for(int i=0;i<str.length();i++){
char c=str.charAt(i);
if(c==' ')
res += "%20";
else
res += c;
}
return res;
}
//第二種情況:原地替換,O(n)的解法
public String replaceSpace(StringBuffer str) {
if(str==null)
return null;
int numOfblank = 0;//空格數量
int len=str.length();
for(int i=0;i<len;i++){ //計算空格數量
if(str.charAt(i)==' ')
numOfblank++;
}
str.setLength(len+2*numOfblank); //設置長度
int oldIndex=len-1; //兩個指針
int newIndex=(len+2*numOfblank)-1;
while(oldIndex>=0 && newIndex>oldIndex){
char c=str.charAt(oldIndex);
if(c==' '){
oldIndex--;
str.setCharAt(newIndex--,'0');
str.setCharAt(newIndex--,'2');
str.setCharAt(newIndex--,'%');
}else{
str.setCharAt(newIndex,c);
oldIndex--;
newIndex--;
}
}
return str.toString();
}
本題有實際的現實意義,在網絡編程中,如果URL參數中含有特殊字符,則可能導致服務器端無法獲得正確的參數值,因此可以通過替換的方法將其轉換為可以識別的字符。轉換規則就是%后面加上該字符ASCII碼的16進制表示,如這里的空格,ASCII碼是0x20(十進制的32),所以可以替換為%20。