1. 程式人生 > 實用技巧 >leetcode 劍指offer 5 替換空格

leetcode 劍指offer 5 替換空格

問題描述:請實現一個函式,把字串 s 中的每個空格替換成"%20"。

在 C++ 語言中, string 被設計成「可變」的型別,因此可以在不新建字串的情況下實現原地修改。

由於需要將空格替換為 "%20" ,字串的總字元數增加,因此需要擴充套件原字串 s 的長度,計算公式為:新字串長度 = 原字串長度 + 2 * 空格個數 ,示例如下圖所示。

演算法流程:

  • 初始化:空格數量 count ,字串 s 的長度 len ;
  • 統計空格數量:遍歷 s ,遇空格則 count++ ;
  • 修改 s 長度:新增完 "%20" 後的字串長度應為 len + 2 * count ;
  • 倒序遍歷修改:i 指向原字串尾部元素, j 指向新字串尾部元素;當 i = j 時跳出(代表左方已沒有空格,無需繼續遍歷);
  • 當 s[i] 不為空格時:執行 s[j] = s[i] ;
  • 當 s[i] 為空格時:將字串閉區間 [j-2, j] 的元素修改為 "%20" ;由於修改了 3 個元素,因此需要 j -= 2 ;
  • 返回值:已修改的字串 s ;
class Solution {
public:
    string replaceSpace(string s) {
        int i = s.size() - 1;
        int n = std::count(s.cbegin(), s.cend(), ' ');
        s.resize(i + n * 2 + 1);
        std::cout << s << std::endl;
        for(int j = s.size() - 1; i >= 0; --i, --j)
        {
            if(s[i] != ' ') 
            {
                s[j] = s[i];
            }
            else 
            {
                s[j] = '0';
                s[j-1] = '2';
                s[j-2] = '%';
                j -= 2;
            }
        }
        return s;
    }
};