题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
以下为 2019.6.5 更新
class Solution {
public:
void replaceSpace(char *str,int length) {
/**
* 我们不妨先统计当前字符串中所有的空格,之后从后往前替换
* 在不开辟新空间的情况下,如果从前往后替换,会覆盖掉原字符串中的字符
*/
// 如果字符串为空,不需要处理
if (!str)
{
return ;
}
int blankCount = 0;
int oldStrLen = strlen(str);
for ( int i = 0; i < oldStrLen; ++i)
{
if(str[i] == ' ')
{
++blankCount;
}
}
// 我们统计到了原字符串中所有的空格,那么替换之后字符串的长度应该为
// 我们不妨先做个判断吧,万一源字符串中没有空格呢,我们就需要处理
if (blankCount == 0)
{
return;
}
// 为什么新长度是 源字符串长度 + 2 * blankCount很好想
// 我们是要替换空格,而空格本来就在原字符串中
// int oldStrLen = strlen(str);
int newStrLen = strlen(str) + 2 * blankCount;
// 之后开始搬移元素以及替换
// 这里我们假设题目给我们的空间足够容纳下替换后的字符串,不考虑越界的情况了
// C语言是用数组模拟的字符串,并且一个C风格的字符串是以 '\0' 结尾
// 所以直接把 str[newStrLen] = str[oldStrLen]没有任何问题
while(oldStrLen >= 0)
{
if(str[oldStrLen] == ' ')
{
str[newStrLen--] = '0';
str[newStrLen--] = '2';
str[newStrLen--] = '%';
--oldStrLen;
}
else
{
str[newStrLen--] = str[oldStrLen--];
}
}
}
};
以上为 2019.6.5 更新
- 题解:
拿到这个题,先分析题意,需要把所有的空格都替换为 “%20”,很明显这个"%20"是一个字符串,不是一个字符,要替换全部空格,字符串的长度肯定会增加,所以必定要统计出字符串中到底有多好个空格,然后新的字符串有多长,然后从后往前依次拷贝,遇到空格替换。
接下来是通过牛客oj的代码:
代码已上传到 github,可用 git 工具下载查看
github 代码链接,欢迎点击查看
class Solution {
public:
void replaceSpace(char *str,int length) {
int countOfBlank = 0;
int lenOfOriginalStr = 0;
char * p = str;
if(str == NULL)
{
return;
}
while(*p)
{
++lenOfOriginalStr;
if(*p++ == ' ')
{
++countOfBlank;
}
}
int len_total = lenOfOriginalStr + 2 * countOfBlank;
char * str1 = str + len_total; // 指针偏移到 '\0'
char * str2 = str + lenOfOriginalStr; // 指针偏移到原始字符串最后
while(str1 > str2)
{
if(*str2 == ' ')
{
*str1-- = '0';
*str1-- = '2';
*str1 = '%';
}
else
{
*str1 = *str2;
}
--str1;
--str2;
}
}
};
有什么问题或者有更好的解法,欢迎留言探讨,谢谢大家 ?