一:题目描述
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy
二:解题思路
首先原来一个空格,替换之后变成‘%’,‘2’,‘0’三个字符,因此字符串会变长。如果在原来的字符串上做替换,那么就可能覆盖修改该字符串后面的内存,,如果创建新的字符串,并在新的字符串上做替换,那么我们可以分配足够的多的内存。由于两种不同的解决方案,我们应该向面试官问清楚,让他明确告诉我们他的需求。假设面试官让我们在原始的字符串上做替换,并保证字符串后有足够的空余内存。这就是函数中length的用途(也是我刚看题,没有弄懂length的作用)
方案一:从前往后遍历字符串,遇到空格,将其替换成“%20”,将后面的内容后移两位,这样很多字符都移动很多次,效率不高
方案二:将从前向后变成从后向前,具体方案如下:
- 首先遍历原字符串,找出字符串的长度以及其中的空格数量,
- 根据原字符串的长度和空格的数量我们可以求出最后新字符串的长度。
- 设置两个指针point1和point2分别指向原字符串和新字符串的末尾位置。
- 如果point1指向内容不为空格,那么将内容赋值给point2指向的位置,如果point1指向为空格,那么从point2开始赋值“02%”
- 直到point1==point2时表明字符串中的所有空格都已经替换完毕。
三:代码实现
class Solution {
public:
void replaceSpace(char *str,int length) {
//判断是否为空
if(str==NULL || length<=0)
return ;
int originalLength=0; //原始字符串长度
int numberOfBlank=0; //空格数
int i=0;
//遍历字符串,统计原始字符串长度,和空格数
while(str[i]!='\0'){
originalLength++;
if(str[i]==' ')
numberOfBlank++;
i++;
}
//空格替换成“%20”后,字符串的长度
int newLength=originalLength+2*numberOfBlank;
//如果替换后的字符串长度大于内存上线,返回
if(newLength>length)
return;
//从后遍历字符串
str[newLength]='\0'; //记得这步!
int indexOfOriginal=originalLength-1;
int indexNew=newLength-1;
while(indexOfOriginal>=0 && indexOfOriginal<indexNew){
if(str[indexOfOriginal]==' '){
str[indexNew--]='0';
str[indexNew--]='2';
str[indexNew--]='%';
}
else
str[indexNew--]=str[indexOfOriginal];
indexOfOriginal--;
}
}
};