请实现一个函数,把字符串 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循环还是有差异的