题目描述:
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
输入:s = “We are happy.”
输出:“We%20are%20happy.”
前言
力扣上评论区的许多大佬都已经给出了c++和java实现的方法,但我却没有找到用纯c语言实现的方法,所以我写了这篇博客用来解释这道题的纯c解法,解法可能不如上面两种语言的好,仅供参考~
思路:
这道题,首先要确保一个字符串的大小要足够装的下替换后的字符
经过观察发现:每有一个空格,字符串长度就增加2
解释:一个空格用来放’%’,剩下需要开辟两个额外空间来放置’2’和’0’
然后我们就可以先开辟一个新的字符数组存放我们的新字符串
新的字符串长度=原字符串长度+(空格个数*2)+1(这里的+1是为了存下字符串末尾的’\0’)
而计算空格的个数,需要遍历一下字符串
//准备工作
int space_num = 0;
int len = strlen(s);
for (int i = 0; i < len; i++)
{
if (s[i] == ' ')
{
space_num++;//计算空格个数
}
}
char* tmp = (char*)malloc(sizeof(char) * (len + space_num * 2 + 1));//开辟字符串
接下来就是替换了,我们采取从后往前替换的方式
一般用这种顺序操作可以防止数据的过多挪动
替换我们替换到(i+space_num*2)的位置上,因为需要留出足够的空间
等到遇到空格后,就换上"%20",然后space_num–;
画图解释
代码
char* replaceSpace(char* s) {
int space_num = 0;
int len = strlen(s);
for (int i = 0; i < len; i++)
{
if (s[i] == ' ')
{
space_num++;
}
}
char* tmp = (char*)malloc(sizeof(char) * (len + space_num * 2 + 1));
for (int i = len; i >= 0; i--)
{
if (s[i] == ' ')
{
space_num--;
tmp[i + space_num * 2] = '%';
tmp[i + space_num * 2 + 1] = '2';
tmp[i + space_num * 2 + 2] = '0';
}
else
{
tmp[i + space_num * 2] = s[i];
}
}
return tmp;
}