1. 程式人生 > >【劍指offer】 字串替換

【劍指offer】 字串替換

題目

請實現一個函式,將一個字串中的每個空格替換成“%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();
}