天天看點

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

1 問題

把字元串裡面空格替換成百分之20

2 代碼實作

第一種時間複雜的o(n * 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  在函數裡面,如果我們新開辟記憶體的指針如果要傳回,我們不要移動這個指針的位置,不然到時外面得到了開辟記憶體移動後的指針進行free的時候,會出問題,是以我們要用個指針變量儲存這個新開辟記憶體的指針,然後用指針變量進行操作記憶體資料

2 在函數裡面如果參數傳遞的是指針,我們盡量不要移動,用個指針變量儲存函數參數裡面的指針,然後用指針變量進行記憶體資料操作

繼續閱讀