题目
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
分析
这道题是一道字符串处理的题,从前向后遍历,如果遇到空格,就将后面的元素向后移动两位。如此一来,如果有n个空格,后面的串就要移动n次,时间复杂度为 O ( n 2 ) O(n^2) O(n2)。需要明确的是,每次遇到空格处理之后,串尾的长度需要更新。
void replaceSpace(char *str,int length) {
int len=0;
while(str[len]!='\0')
{
++len;
}
int Oldlen=len;
int i=0;
while(i<=Oldlen)
{
if(str[i]==' ')
{
for(int j=Oldlen;j>i;j--)
{
str[j+2]=str[j];
}
str[i++]='%';
str[i++]='2';
str[i++]='0';
Oldlen+=2;
}
else
{
i++;
}
}
}
但是如果我们从后向前遍历,遇到空格,就将后面的元素移动到最终的位置,所有元素只需要移动一次,时间复杂度为 O ( n ) O(n) O(n)。首先我们设定两个指针,一个指向新串末尾,一个指向旧串末尾。如果不为空格,那么两个指针都向前移动一位。如果是空格,那么指向新串的指针移动三位,指向旧串的指针依然移动一位。其实,也是快慢指针的思想。
void replaceSpace(char *str,int length) {
int len=0;
int cnt=0;
while(str[len]!='\0')
{
if(str[len]==' ')
cnt++;
++len;
}
int Oldlen=len;
int Newlen=len+cnt*2;
if(Newlen>length)
return;
int i=Oldlen;
int j=Newlen;
while(i>=0&&j>i)
{
if(str[i]!=' ')
str[j--]=str[i];
else
{
str[j--]='0';
str[j--]='2';
str[j--]='%';
}
i--;
}
}
无论是哪种方法都要注意一点,字符串以’\0’结尾,我们计算的时候需要将’\0’纳入长度。比如用上面的方法计算 " h e l l o w o r l d " " helloworld" "helloworld"长度为11,没有考虑\0,实际字符串长度为12,因此我们使用的时候Oldlen指向\0,不用在按照长度-1来取下标。 还有一点,题目没有说明,参数length是这个字符串最大的长度。