劍指Offer刷題Java版——替換空格

題目

請實現一個函數,將一個字符串中的每個空格替換成“%20”。例如,當字符串爲We Are Happy.則經過替換之後的字符串爲We%20Are%20Happy。

解題思路

  1. 第一反應是replace對不對?API大家都會用,但是replace的底層是遍歷查找,然後添加,由於要替換的字符數大於原字符數,因此會導致後面的字符進行復制移動,因此除了最後一個是空格的情況下,有幾個空格就要遍歷幾次,就要複製幾次字符數組,空間和時間複雜度都很高
  2. 第二種思路自然就是再建一個StringBuffer,然後比較字符進行復制,這種做法的時間複雜度和空間複雜度都是n
  3. 第三種思路是不新建一個StringBuffer,而是用原來那個,先遍歷一遍統計出總的空格數量,然後算出總長度並將源StringBuffer的長度修改爲改長度,同時爲了防止覆蓋,採用從後向前替換的方式,採用雙指針移動字符位置。由於提前計算好的總長度,因此在倒歷時達到頭部的空格兩個指針纔會碰到一起,否則舊指針數據不會受到影響

解題代碼

 	public static String replaceSpace(StringBuffer str) {
        if (str == null) return null;
        int blankNum = 0;
        for (int i=0;i<str.length();i++){
            if (str.charAt(i) == ' '){
                blankNum++;
            }
        }
        // 舊長度
        int oldLength = str.length();
        // 指向舊字符串的指針
        int oldIndex = oldLength-1;
        // 新的總長度
        int totalLength = str.length()+blankNum*2;
        // 新buffer的倒歷指針
        int index = totalLength-1;
        str.setLength(totalLength);

        while (oldIndex>=0){
            char c = str.charAt(oldIndex);
            if (c == ' '){
                str.setCharAt(index--,'0');
                str.setCharAt(index--,'2');
                str.setCharAt(index--,'%');
            }else {
                str.setCharAt(index--,c);
            }
            oldIndex--;
        }
        return str.toString();
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章