【劍指offer】【2】字串的空格

love_Aym發表於2018-05-28
時間限制:1秒 空間限制:32768K 熱度指數:594664
本題知識點: 字串

題目描述

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

知識補充:

1、StringBuffer

    是可變類,在修改字串內容時,不會建立新的物件,因此它比String類更適合修改字串。 

  • StringBuffer如何轉換成陣列

        StringBuffer類沒有提供同String一樣的toCharArray方法,因此需要使用toString方法轉換成String型別然後呼叫toCharArray方法轉換成陣列。

  • StringBuffer的輸出列印

        StringBuffer物件有一個toString()方法,就是將你的快取的字符串列印出來,是String型別的

2、單引號和雙引號的區別

  • 單引號引的資料,是char型別的。雙引號引的資料,是String型別的;
  • char定義時用單引號,只能有一個字母,數字:char c='c'。而String用雙引號,可以是一個,也可能是多個字母,漢字等。就是所謂的字串:String s="adsaf";
  • char只是一個基本型別,而String 可以是一個類,可以直接引用。比如char c='c',不能直接對c呼叫方法。String s="abc";。這時可以呼叫s.charAt(0);等方法,因為String是類,這是就是物件的呼叫了。
3、StringBuffer的常用方法

  • toString():轉換為字串
  • toCharArray():將字串轉換為字元陣列
  • charAt(index):按照index索引值
  • setCharAt(index,value):按照index設定
  • setLength(newLength):設定長度

本人程式碼:
public class Solution {
    public String replaceSpace(StringBuffer str) {
        char[] ch = str.toString().toCharArray();
        StringBuffer strr = new StringBuffer();
        for(int i = 0; i < ch.length;i++){
            if(ch[i] == ' '){
                strr.append("%20");
            }else{
                strr.append(ch[i]);
            }
        }
        return strr.toString();
    }
}


改進:

考慮空間複雜度,不new物件。

如果不把字串轉換為陣列,直接處理字串也行。使用str.charAt也可以對字串進行遍歷。

如果從前向後遍歷,遇到空格就替換成“%20”,那麼其後的字串的內容就會被替換掉,因為沒有開闢新的字串用的是用一個str。因此如果可以先將字串的長度進行擴充,那麼擴充的部分目前還是空可以存放東西,若從後向前更新字串就不會出現字串被覆蓋消失的問題。

思路二:先計算需要多少空間,然後從後向前遍歷,不斷填充,遇到空格替換成“%20”即可。

public class Solution {
    public String replaceSpace(StringBuffer str) {
    	//計算空格的數量
        int num = 0;
        for(int i = 0; i < str.length();i++){
            if(str.charAt(i) == ' '){
                num++;
            }
        }
        //計算新字串的長度
        int newLength = str.length() + 2*num; 
        //設定兩個指標,一個是從後向前遍歷字串查詢空格,另一個是從後向前更新填充後的字串
        int indexOld = str.length() -1; 
        int indexNew = newLength - 1; 
        //擴充字串長度
        str.setLength(newLength); 
        //從後向前遍歷,並進行更新
        for(; indexOld >=0  && indexNew >= 0; indexOld--){
            if(str.charAt(indexOld) == ' '){
                str.setCharAt(indexNew--,'0');
                str.setCharAt(indexNew--,'2');
                str.setCharAt(indexNew--,'%');
            }else{
                str.setCharAt(indexNew--, str.charAt(indexOld));
            }
        }
        return str.toString();
    }
}



相關文章