Problem 4:替換空格(字串)
一、題目描述
請實現一個函式,將一個字串中的每個空格替換成“%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:
不使用StringBuffer
三、Java實現
方法1源程式:
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 = "Wearehappy"; //沒有空格 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])); } } }