《劍指offer》面試題5:替換空格

題目:實現一個函數,將字符串中的每個空格替換成字符串“%20”。

解題思路1

使用暴力的方法,從左到右掃描一遍,當遇到空格時就把空格替換成“%20”,然後把空格後面的字符都後移2個位置。由於需要整個字符串掃描一遍,時間爲O(n),替換空格時移動字符的時間複雜度爲O(n),因此總的時間複雜度爲O(n^2)。

解題思路2

因爲每個空格會替換成一個三個字符的字符串,因此替換後的新字符串的長度是可知的。從前往後替換最耗時的操作是後移字符,那麼就可以轉換思維,從後往前替換,每次替換就不需要移動其他字符,時間複雜度爲O(1)。因此需要的操作是

  1. 掃描一遍字符串,統計空格個數算出新字符串長度從而得到新字符串末尾的位置,時間爲O(n)
  2. 從後往左掃描字符串,將空格替換成字符串“%20”

因此,總的時間複雜度爲O(n)。這種從前往後難,從後往前易的思維可以遷移到其他類似問題中:

  • 將有序數組B合併到有序數組A中,因爲數字總數已知,就可以從右往左插入。
  • 大數乘法,結果的位數不會超過兩個數位數之和,因此可以新建一個長度爲兩數位數之和的字符串作爲結果,在結果字符串上進行操作。
    void replaceSpace(char *str,int length) {
        if (str==nullptr || length<=0)
            return;

        int p = length;

        for (int i=0;i<length;i++)
            if (str[i]==' ')
                p += 2;

        str[p--] = '\0';
        for (int i=length-1;i>=0;i--){
            if (str[i]==' '){
                str[p--] = '0';
                str[p--] = '2';
                str[p--] = '%';
            }
            else
                str[p--] = str[i];               
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章