劍指offer之把字符串里面空格替換成百分之20

1 問題

把字符串里面空格替換成百分之20
 
2 代碼實現(xiàn)

第一種時間復雜的o(n * n)實現(xiàn)

    #include <stdio.h>
    #include <stdlib.h>
     
     
    char* insert(char *a, int len, char *replace, int replaceLen)
    {
        //先得到多少個空格
        char *p = a;
        int count = 0;
        while (*p != '\0')
        {
            if (*p == ' ')
            {
                ++count;
            }
            ++p;
        }
        //計算新的字符串長度
        int newLen = len + count * (replaceLen - 1);
        char *newP = NULL;
        newP = (char *)malloc(newLen);
        if (!newP)
        {
            printf("malloc fail\n");
        }
        //新開辟內存的指針后面操作的時候
        //我們用新的指針變量保存新開辟內存的指針
        char *new = newP;
        //盡量不要修改原始字符串的指針位置
        char *head = a;
        //盡量不要修改原始需要替換字符串的位置
        char *rep = replace;
        while(*head != '\0')
        {
            if (*head != ' ')
            {
                *new++ = *head++;   
            }
            else
            {
                *head++;
                while (*rep != '\0')
                {
                    *new++ = *rep++;
                }
                //這里要記得移動指針完了之后復原替換字符串指針
                rep = replace;
            }
        }
            //尾巴要記得設置'\0'
            *new = '\0';
        //這里是申請了哪個內存指針就返回哪個
        //千萬不要移動這個新開辟內存的指針
        //不然后面進行free(newP)就有問題
        return newP;
    }
     
     
    int main()
    {
       
        char a[] ="ab cd ef";
        int len = sizeof(a);
        char *chars = insert(a, len, "%20", 3);
        printf("chars is %s\n", chars);
        free(chars);
        return 0;   
    }

 
3 運行結果

chars is ab%20cd%20ef

 
4 總結

1  在函數(shù)里面,如果我們新開辟內存的指針如果要返回,我們不要移動這個指針的位置,不然到時外面得到了開辟內存移動后的指針進行free的時候,會出問題,所以我們要用個指針變量保存這個新開辟內存的指針,然后用指針變量進行操作內存數(shù)據(jù)

2 在函數(shù)里面如果參數(shù)傳遞的是指針,我們盡量不要移動,用個指針變量保存函數(shù)參數(shù)里面的指針,然后用指針變量進行內存數(shù)據(jù)操作


 


作者:chen.yu
深信服三年半工作經驗,目前就職游戲廠商,希望能和大家交流和學習,
微信公眾號:編程入門到禿頭 或掃描下面二維碼
零基礎入門進階人工智能(鏈接)