【劍指offer】 字串替換
阿新 • • 發佈:2019-01-30
題目:
請實現一個函式,將一個字串中的每個空格替換成“%20”。例如,當字串為We Are Happy.則經過替換之後的字串為We%20Are%20Happy。
1、
為了減少插入時字串的移位消耗,可生成一個物件去進行append操作,而不是在原來字串進行插入操作;
為了減少不必要的append,可以通過start和end確定要進行append的子串,通過判斷是否為空格進行append的時機;
public static String replaceSpace(StringBuffer str) { StringBuffer stringBuffer=new StringBuffer(); int start=0; int end=0; int lenght=str.length(); while (end<lenght){ //計算從何處開始append,減少append次數 if (str.charAt(end)!=' '){ end++; }else {//當char 等於空格時開始替換 stringBuffer.append(str.substring(start,end)).append("%20"); end++; start=end; } } stringBuffer.append(str.substring(start,end));//最後一次,將末尾start,end的子串插入 return stringBuffer.toString(); }
2、 不新生成物件,採用統計空格數,重新賦值字串長度,然後採用從尾部賦值的操作方式,減少移位,提升效率。
public static String replaceSpace2(StringBuffer str) { int count=0; int oldlen=str.length(); for (int i=0;i<oldlen;i++){//計算空格數 if (str.charAt(i)==' ') count++; } int newlen=oldlen+count*2; //計算新字串長度 str.setLength(newlen); for (int i=oldlen-1;i>=0;i--){//從尾開始進行賦值操作,避免從頭部操作時的char的移位 char data=str.charAt(i); if (data!=' '){//如果不等於空格則直接賦值 str.setCharAt(--newlen,data); } else {//如果等於空格,則賦值%20 str.setCharAt(--newlen,'0'); str.setCharAt(--newlen,'2'); str.setCharAt(--newlen,'%'); } } return str.toString(); }