替换空格
题目描述
请实现一个函数,把字符串 s
中的每个空格替换成"%20"。
示例 1:
输入:s = "We are happy." 输出:"We%20are%20happy."
限制:
0 <= s 的长度 <= 10000
解法:
首先空格的长度为 1,替换后长度为 3,原字符串没办法存储替换后的字符串。作者的意思其实是在不利用额外存储空间的情况下来完成此题。但是字符串后面是否有足够的空间也没法保证。因此,这里假设 \0
后面还有空间可以使用。
具体做法就是从后往前处理,先计算出替换后的字符串的长度。而后从原字符串结尾开始处理,非空格那就移动到最后面,空格那就往前加入 %20
。
char* replaceSpace(char* s){
int num_space = 0;
int len = 0;
for(char *p = s; *p != '\0'; p++){
if(*p == ' '){
num_space ++;
}
len ++;
}
int last = len + num_space * 2;
for(int i=len; i>=0; i--){
if(s[i] == ' '){
s[last--] = '0';
s[last--] = '2';
s[last--] = '%';
}else{
s[last--] = s[i];
}
}
return s;
}
int main(){
char s[] = new char[100];
strcpy(s, "hello world");
replaceSpace(s);
printf("%s\n", s);
}
本来挺简单的一个题,结果踩了一个大坑,在设置 20%
的时候,我使用了如下写法:
strcpy(s + i - 2, "20%");
但没有意识到 strcpy
会在字符串后面加入 \0
。因此放入的并不是单纯的 20%
。一种方法是使用 strncpy
限定拷贝的长度。
strncpy(s + i - 2, "20%", 3);