这是第二天,来自《剑指offer》
先吐槽一波今天的自己,今天一整天的课。。。。。。所以,今天到现在才开始看书。。。emmm,批评一波。进度太慢了
字符串
C/C++中每个字符串都已字符‘\0’
作为结尾,这样我们就能很方便找到字符串的最后尾部。这样也会导致字符串中都有一个额外字符的开销,不熟悉的话会造成字符串的越界。
为了节省内存,C/C++把常量字符串放在单独的一个内存区域。当几个指针赋值给相同的常量字符串时,实际上会指向相同的内存地址。但用常量内存初始化数组,确实每个数组一个内存区域
题目
替换空格
请实现一个函数,把字符串中的每个空格替换成“%20”.例如,输入“We are happy.”,输出“We%20are%20happy.”
问题1:为什么是”%20”?
在网络编程中,如果URL参数中含有特殊字符串,如空格、”#”等,则可能导致服务器端无法获得正确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。转换的规则是在‘%’后面跟上ASCII码的两位十六进制的表示。
思路:
从后往前把字符串中的空格替换成“%20”
代码:
class Solution {
public:
void replaceSpace(char *str,int length) {
if (str == nullptr || length <= 0)
return;
int blankNum = 0;
int realLen;
for (realLen = 0; str[realLen] != '\0'; realLen++)
{
if (str[realLen] == ' ')
blankNum++;
continue;
}
int newLength = ++realLen + blankNum * 2;
if (newLength > length)
return;
int indexReal = --realLen;
int indexNew = --newLength;
while (indexReal >= 0 && indexReal < indexNew) {
if (str[indexReal] == ' ') {
str[indexNew--] = '0';
str[indexNew--] = '2';
str[indexNew--] = '%';
indexReal--;
}
else
str[indexNew--] = str[indexReal--];
}
}
};
总结就是要有一个思想。每次插入数字从后开始往前复制比从前开始往后复制需要移动的次数相比会少很多