請實現一個函數,將一個字符串中的每一個空格替換成「%20」。例如,當字符串爲We Are Happy.則通過替換以後的字符串爲We%20Are%20Happy。
注:用%20替換的緣由,空格在ASCII碼中的序號爲32,用十六進制表示爲0x20。算法
參考劍指offer上的說明,須要考慮操做是原地(in place)操做仍是新建字符串操做。以原地操做爲例,首先考慮最直觀的方法-從前日後依次替換。在第一個空格處,空格替換爲%20,空格以後的字符所有右移三個位置。同理,第一次移動後,向後遍歷,在第二個空格處繼續將後邊字符移動。數組
從算法角度分析,設輸入規模爲n,咱們須要循環遍歷字符串中空格(循環中,判斷是否爲空的操做執行n次),在每一個空格處,進行字符移動操做,每一個字符的移動又至關於一次循環。所以,總的運行效率爲app
$$ O(n^2) $$函數
直接遍歷移動的方法效率過低,所以,考慮其餘方法。
方法1:
考慮比Sting高效的字符串操做工具-StringBuffer,一樣使用以前的直接遍歷的方法,可是對比發現,不須要重複移動,每次判斷執行一次操做,共執行n此判斷,效率爲O(n)
方法2:
不使用StringBuffer,參考劍指offer書上的方法,在原字符串上進行操做,利用兩條指針進行數據移動的思路,具體見方法2代碼。(注意倒序複製提升效率的思路)工具
方法1源程序:測試
package jz_offer; public class problem04 { public static String spaceReplace(String str) { StringBuffer newStr=new StringBuffer(); int length=str.length(); //特殊狀況, if(str==null) 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])); } } }
(2019/2/17 增長)注:特殊狀況下原條件爲str==null||length==0,後者爲空字符串,輸出應仍爲空字符。所以後者應捨去,不然OJ會不經過(牛客測試)。spa
方法2部分程序:指針
//二、使用臨時字符數組 public static String spaceReplace2(String str) { int length=str.length(); int spaceCount=0; for(int i=0;i<length;i++) if(str.charAt(i)==' ') { spaceCount++; } int newLength=length+spaceCount*2; char[] newStrArray=new char[newLength]; //特殊狀況 if(str==null) return null; int j=newLength-1; for(int i=length-1;i>=0;i--) { if(str.charAt(i)==' ') { newStrArray[j]='0'; newStrArray[j-1]='2'; newStrArray[j-2]='%'; j=j-3; } else { newStrArray[j]=str.charAt(i); j--; } } return new String(newStrArray); }