劍指offer2:C++實現的替換空格(字符中的空格替換為“%20”)


1. 題目描述

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

2. 思路和方法:

2.1 建議使用的方法:

  中心思想:統計字符串中空格的個數,計算擴容字符串后的長度,然后執行復制和替換。我們從后往前開始替換,首先遍歷一遍字符串,統計出空格的個數,並由此能夠計算出替換之后的字符串的長度。接着再次從后往前遍歷字符串,同時設置兩個指針P1和P2,P1指向原始字符串末尾,P2指向替換之后的字符串末尾。我們向前移動P1,逐個把它指向的字符復制到P2指向的位置,直到碰到第一個空格為止。然后把P1向前移動一格,在P2之前插入字符串“%20”,同時P2向前移動3格。重復此過程,直到所有的空格都已替換完。這種做法的時間復雜度為O(n)。

2.2 不建議的方法:

  簡單暴力解法,從頭到尾遍歷字符串,碰到空格,首先將后面的所有字符串往后移動2個字符,才能空出3個字符位子插入字符“%20”,對於一個長度為n的字符串,對每個空格,需要移動后面O(n)個字符,因此包含n個空格的字符串,總的時間復雜度為O(n*n)。

3. C++實現 

#include<iostream> 
/*
將字符串中的空格替換成%20
*/
class Solution {
public:
    void replaceSpace(char *str, int length) {
        if (str == NULL && length <= 0){
            return;
        }
        /*original_length為字符串str的實際長度*/
        int original_length = 0;            //原始長度
        int number_blank = 0;                //空格數
        int i=0;
        while (str[i++] != '\0'){                //遍歷字符串
            ++original_length;                //長度+1
            if (str[i] == ' '){
                ++number_blank;                //遇到空格+1
            }
        }
        /*new_length為把空格替換成'%20'之后的長度*/
        int new_length = original_length + 2 * number_blank;

        int index_original = original_length;    //原始字符串末尾索引值
        int index_new = new_length;                //計算長度后的字符串末尾索引值

        /*index_original指針開始向前移動,如果遇到空格,替換成'%20',否則進行復制操作*/
        while (index_original >= 0 && index_new > index_original){
            if (str[index_original] == ' '){
                str[index_new--] = '0';
                str[index_new--] = '2';
                str[index_new--] = '%';
            }
            else{
                str[index_new--] = str[index_original];
            }
            --index_original;
        }
    }
};

int main(){
    Solution a;
    char s[] = "hello world! ";
    printf("%s\n", s);
    a.replaceSpace(s, 13);
    printf("?%s? ", s);
    getchar();
    return 0;
}
View Code

參考資料

https://blog.csdn.net/YF_Li123/article/details/70332267

https://blog.csdn.net/yeqiang19910412/article/details/81567403


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM