05 替换空格
题目
请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are happy.”,则输出“We%20are%20happy.”。
C语言题解
- 先遍历一次字符串,这样就能统计出字符串中空格的总数,并可以由此计算出替换之后的字符串的总长度。
以前面的字符串"We arehappy."为例,"We are happy."这个字符串的长度是14(包括结尾符号'\0'),里面有两个空格,因此替换之后字符串的长度是18。 - 从字符串的后面开始复制和替换。
准备两个指针,P1和P2。P1指向原始字符串的末尾,而P2指向替换之后的字符串的末尾。接下来向前移动指针P1,逐个把它指向的字符复制到P2指向的位置,直到碰到第一个空格为止。接着向前复制,直到碰到第二、三或第n个空格。
class Solution {
public:
void replaceSpace(char *str,int length) {
//输入异常检查
if(str == NULL || length <= 0)
return;
// 统计出空格的数数量以及原来字符串的长度并计算出新的字符串的长度
int spaceLength = 0;
int oriLength = 0;
int i=0;
while(str[i] != '\0')
{
++oriLength;
if(str[i] == ' ')
++spaceLength;
++i;
}
int newLength = oriLength + spaceLength * 2;
// 安全性检测,即新字符串的额长度不能够超过给定的安全长度
if(newLength >length)
return;
// 索引从字符串的整个长度开始,本质上是将字符串末尾的'\0'加入到字符数组中
int oriIndex = oriLength;
int newIndex = newLength;
// 由后向前检查原来的字符串,如果遇到空格则进行替换
// 终止条件是新旧字符串的索引达到了一致,这时表明没有空格再需要替换,另外,需要保证索引不能小于0
while(oriIndex >= 0 && oriIndex != newIndex)
{
if(str[oriIndex] == ' ')
{
str[newIndex--] = '0';
str[newIndex--] = '2';
str[newIndex--] = '%';
//此处不可遗漏
oriIndex--;
}
else
{
str[newIndex--] = str[oriIndex--];
}
}
}
};
注意:
- 如果在原来的字符串上做替换,由于新的字符串会变长有可能会覆盖原来字符串后面的内存。
- 如果创建新的字符串,我们可以分配足够多的内存,但是需要借助额外的空间。
- 字符串以'\0'作为结尾,使用字符数组存储时要多分配一个字节。
- 为了节省内存, C++中把常量字符串存放在一个单独的内存区域,当不同的指针指向相同的字符串时,他们实际上指向相同的内存地址。
C++ 题解
class Solution {
public:
string replaceSpaces(string &str) {
string res;
for(auto s : str)
{
if(s == ' ')
res += "%20";
else
res += s;
}
return res;
}
};
注意:
- 这里使用了额外的存储空间。
- 思路是:从前往后枚举原字符串:
- 如果遇到空格,则在string类型的答案中添加 "%20";
- 如果遇到其他字符,则直接将它添加在答案中;
python 题解
方法一
按照上述的C语言解题思路使用python实现:
class Solution:
# s 源字符串
def replaceSpace(self, s):
# write code here
if not isinstance(s, str) or len(s) <= 0 or s == None:
return ''
spaceNum = 0
for i in s:
if i == " ":
spaceNum += 1
newStrLen = len(s) + spaceNum * 2
newStr = newStrLen * [None]
indexOfOriginal, indexOfNew = len(s) - 1, newStrLen - 1
while indexOfNew >= 0 and indexOfOriginal <= indexOfNew:
if s[indexOfOriginal] == ' ':
newStr[indexOfNew - 2: indexOfNew + 1] = ['%', '2', '0']
indexOfNew -= 3
indexOfOriginal -= 1
else:
newStr[indexOfNew] = s[indexOfOriginal]
indexOfNew -= 1
indexOfOriginal -= 1
return ''.join(newStr)
注意:
- 这里采用python申请一个长度为
newStrLen
的列表,注意其初始化形式newStr = newStrLen * [None]
while indexOfNew >= 0 and indexOfOriginal <= indexOfNew:
这一句不可以写成while indexOfNew >= 0 and indexOfOriginal != indexOfNew:
,因为如果当只有一个元素时,indexOfNew
和indexOfOriginal
将会相等,采用!
则会越过整个条件判断,而此时newStr
中元素是None
将会造成异常,同样也不可以只写成while indexOfNew >= 0 and indexOfOriginal < indexOfNew:
。- 采用
join
函数将列表转换成字符串。
方法二
使用python的内置函数replace
:
class Solution:
# s 源字符串
def replaceSpace(self, s):
# write code here
return s.replace(' ','%20')