一、題目描述
請實現一個函數,將一個字符串中的每個空格替換成“%20”。例如,當字符串爲We Are Happy.則經過替換之後的字符串爲We%20Are%20Happy。
注:用%20替換的原因,空格在ASCII碼中的序號爲32,用十六進制表示爲0x20。
二、思路分析
參考劍指offer上的說明,需要考慮操作是原地(in place)操作還是新建字符串操作。以原地操作爲例,首先考慮最直觀的方法-從前往後依次替換。在第一個空格處,空格替換爲%20,空格之後的字符全部右移三個位置。同理,第一次移動後,向後遍歷,在第二個空格處繼續將後邊字符移動。
從算法角度分析,設輸入規模爲n,我們需要循環遍歷字符串中空格(循環中,判斷是否爲空的操作執行n次),在每個空格處,進行字符移動操作,每個字符的移動又相當於一次循環。因此,總的運行效率爲
$$ O(n^2) $$
直接遍歷移動的方法效率太低,因此,考慮其他方法。
方法1:
考慮比Sting高效的字符串操作工具-StringBuffer,同樣使用之前的直接遍歷的方法,但是對比發現,不需要重複移動,每次判斷執行一次操作,共執行n此判斷,效率爲$$\[O({n^2})\]$$
方法2:
三、Java實現
源程序:
package jz_offer;
public class problem04 {
public static String spaceReplace(String str) {
StringBuffer newStr=new StringBuffer();
int length=str.length();
//特殊情況
if(str==null||length==0)
return null;
for(int i=0;i<length;i++) {
if(str.charAt(i)==' ') {
newStr.append("%20");
}else {
newStr.append(str.charAt(i));
}
}
return newStr.toString();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//包含空格-:前-後-中-連續空格
String str1 = " Wearehappy";
String str2 = "Wearehappy ";
String str3 = "We are happy";
String str4 = "We are happy ";
//沒有空格
String str5="Wearehappy";
//特殊輸入測試:只有連續空格、只有一個空格、是null指針、是空字符串
String str6=" ";
String str7=" ";
//String str8=null; //會出現NullPointerException(運行時異常)
String str8="";
String[] strArray=new String[] {str1,str2,str3,str4,str5,
str6,str7,str8};
for(int i=0;i<strArray.length;i++) {
System.out.println(spaceReplace(strArray[i]));
}
}
}