问题:
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
思路:
分析:首先分析这个函数,返回值为void,这意味着不能新建一个string类型的变量,最后返回该变量,而是在原来的字符串上做替换,第一个参数为char *str,为一个指针,指向字符串的第一个元素,意味着不能调用字符串函数,因为没有可以调用的对象
解题:首先计算出原始字符串的长度originallength,计算出原始字符串中空格的个数banknumber,根据这两个数据可以算出新串的长度,长度为原始长度加两倍空格长度newlength=originallength+banknumber*2;
从后往前替换,之后从尾向头遍历原始字符串,将数据搬移到尾元素在newlength位置的地方,从尾向头排列,若出现空格,则依次插入‘0’、‘2’、‘%’,直到遍历结束。
!!!注意:字符串是以’\0’为结束标志,一定要在newlength的位置插入’\0’,即str[newlength]=’\0’;
方法一:
class Solution {
public:
void replaceSpace(char *str,int length)
{
if(str==NULL)
return;
int originallength=0;
int banknumber=0;
for(int i=0;str[i]!='\0';i++)
{
originallength++;
if(str[i]==' ')
banknumber++;
}
int newlength=originallength+banknumber*2;
int pos=newlength-1;
str[newlength]='\0'; //设置字符串结束符
for(int i=originallength-1;i>=0;i--)
{
if(str[i]==' ')
{
str[pos--]='0';
str[pos--]='2';
str[pos--]='%';
}
else
str[pos--]=str[i];
}
}
};
方法二
把字符串末尾的结束符’\0’当做普通字符处理,从后向前遍历,依次向后移动
class Solution {
public:
void replaceSpace(char *str,int length)
{
if(str==NULL)
return;
int originallength=0;
int banknumber=0;
for(int i=0;str[i]!='\0';i++)
{
originallength++;
if(str[i]==' ')
banknumber++;
}
int newlength=originallength+banknumber*2;
for(int i=originallength;i>=0;i--)
{
if(str[i]==' ')
{
str[newlength--]='0';
str[newlength--]='2';
str[newlength--]='%';
}
else
str[newlength--]=str[i];
}
}
};
方法三:
从前向后遍历,每发现一个空格,就将空格后面的字符依次向后挪动两位(包括字符串末尾的结束标识符’\0’),所以挪动的开始位下表为length
class Solution {
public:
void replaceSpace(char *str,int length)
{
if(str==NULL)
return;
for(int i=0;i<=length;i++)
{
if(str[i]==' ')
{
for(int j=length;j>i;j--)
str[j+2]=str[j];
str[i]='%';
str[i+1]='2';
str[i+2]='0';
length=length+2;
}
}
}
};
算法复杂度分析:
从后向前遍历,只有单循环,算法复杂度为O(n);
从前向后遍历,在遍历循环的内部,如果发现了空格,需要将空格后面的字符依次移动两位,算法复杂度为O(n*n);