将字符串中的空格转换为%20
class Solution {
public:
void replaceSpace(char *str, int length)
{
}
};
这道题时牛客网上刷到一道题,大致一看,就有了思路:
开个源字符串3倍的空间 ,将源字符串逐次考进去,遇到空格转换为%20.再重新赋给源字符串。
可是写了一大堆,编译就不给过(提交不给过),说是调用太复杂,,,,问题肯定是开了空间导致的。
我以为,源字符串的空间大小就是他的长度,想加字符就得重来空间,果然,我以为的就是我以为的。一直在新空间和旧空间的赋值上思考,比如:relloc失败,深拷贝和浅拷贝的后果等等,弄了一大堆,还把自己绕进去了。所以啊,以后做题还是要有 “此路不通,请绕行”的觉悟。
下面是我去查阅了这类问题的解法后自己做出的一个合理的解决方案:
原来人家源字符串的空间大小不是不够啊,突然就恍然大悟。
//将字符串中的空格转换为%20(源字符空间一般够用)
class Solution {
public:
void replaceSpace(char *str, int length)//length为str字符的空间总字节数
{
if (!str && length <= 0)
{
return;
}
int blankcount = 0;//空格数
int newlen;
char* cur = str;
int oldlen = 0;//字符串长度
while (*cur != '\0')//找出空格的个数和字符串长度
{
if (*cur == ' ')
{
blankcount++;
}
cur++;
oldlen++;
}
newlen = oldlen + blankcount * 2;//新的字符串长度
if (newlen > length)//判读给出的长度是否足够将空格扩充成%20
{
return;
}
for (int i = newlen; cur != str;cur--)//从最后一个开始向后赋值
{
if (*cur == ' ')
{
str[i] = '0';
str[i - 1] = '2';
str[i - 2] = '%';
i -= 3;
}
else
{
str[i] = *cur;
i--;
}
}
}
};
其实代码核心东西并不多,大多东西只是一些防止传入错误的判断。(牛客,力扣答题一定要注意这些,否则会浪费很多时间,还不知道问题出在哪)