劍指offer05替換空格 C語言解答總結
阿新 • • 發佈:2021-05-11
請實現一個函式,把字串 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迴圈還是有差異的