1. 程式人生 > 其它 >劍指offer05替換空格 C語言解答總結

劍指offer05替換空格 C語言解答總結

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

示例 1:

輸入:s = “We are happy.”
輸出:“We%20are%20happy.”

限制:

0 <= s 的長度 <= 10000

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

這題本來非常簡單,但是用C語言寫還是出了一些問題

首先對於題意的理解有偏差,題中說要修改字串s的內容,於是我就直接對s修改了,發現指標越界,說明s的大小已經確定了,因為要把空格替換成3個字元,因此字串大小必然改變,所以在原地址上修改是不可行的。

看來只能malloc一塊地址了,把新的字串寫進去,但是需要注意了,一定不能free,不然傳出為空了

做題不得已這樣,平時寫程式碼最好不要把malloc和free分開到兩個函式內,這樣容易記憶體洩露。

思路很簡單:遍歷一下字串,獲取到字串大小,空格數量,
申請記憶體大小為:原字串大小 + 空格數x2+1(用來放 “\0”)
後面再遍歷一邊字串就OK了,O(n)的複雜度

char* replaceSpace(char* s){
    if (s == NULL) return s;
    
    int size = 0;
    int num = 0;
    char* temp = s;
while(*temp != '\0'){ if(*temp == ' ') num++; size++; temp++; //temp++一定要放到這裡, //如果在迴圈條件中++,判斷字元是否為空時指標已經偏移了 } char* array_cpy = (char*)malloc((size+1+num*2)*sizeof(char)); temp = array_cpy; for(int i=0;i<size;i++){ if(*s == ' '
){ *temp++ = '%'; *temp++ = '2'; *temp++ = '0'; s++; }else{ *temp++ = *s++; } } *temp = '\0'; //free(array_cpy);//一定不能釋放 return array_cpy; }

計算字元大小以及空格數量時,需要注意小細節,原字串指標偏移一定後置

舉個例子:
在這裡插入圖片描述n–的操作在判斷完迴圈條件後立即執行,這裡跟for迴圈還是有差異的