题目描述:
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
分析:
将长度为1的空格替换为长度为3的“%20”,字符差的产度变长。如果允许我们开辟一个新的数组来存放替换空格后的字符串,那么这道题目就非常简 单。设置两个指针分别指向新旧字符串首元素,遍历原字符串,如果碰到空格就在新字符串上填入“%20”,否则就复制元字符串上的内容。但是如果面试官要求 在原先的字符串上操作,并且保证原字符串有足够长的空间来存放替换后的字符串,那么我们就得另想方法。
如果从前往后替换字符串,那么保存在空格后面的字符串肯定会被覆盖,那么我们就考虑从后往前进行替换。
- 首先遍历原字符串,找出字符串的长度以及其中的空格数量,
- 根据原字符串的长度和空格的数量我们可以求出最后新字符串的长度。
- 设置两个指针point1和point2分别指向原字符串和新字符串的末尾位置。
- 如果point1指向内容不为空格,那么将内容赋值给point2指向的位置,如果point1指向为空格,那么从point2开始赋值“02%”
- 直到point1==point2时表明字符串中的所有空格都已经替换完毕。
class Solution {
public:
void replaceSpace(char *str,int length) {
int blanknumber=0;
int i;
for(i=0;str[i]!='\0';i++)
{
if(str[i]==' ')
blanknumber++;
}
int k=i+2*blanknumber;
if(k>length)
return;
str[k]='\0';
int point1=i-1,point2=k-1;
for(;point1>=0&&point2>point1;point1--)
{
if(str[point1]==' ')
{
str[point2--]='0';
str[point2--]='2';
str[point2--]='%';
}
else
str[point2--]=str[point1];
}
}
};
public:
void replaceSpace(char *str,int length) {
int blanknumber=0;
int i;
for(i=0;str[i]!='\0';i++)
{
if(str[i]==' ')
blanknumber++;
}
int k=i+2*blanknumber;
if(k>length)
return;
str[k]='\0';
int point1=i-1,point2=k-1;
for(;point1>=0&&point2>point1;point1--)
{
if(str[point1]==' ')
{
str[point2--]='0';
str[point2--]='2';
str[point2--]='%';
}
else
str[point2--]=str[point1];
}
}
};