题目:请实现一个函数,把字符串中的每个空格替换成"%20",例如输入“We are happy” ,输出"We%20are%20happy"
解题思路:
首先会想到从头到尾遍历一遍string,只要遇到空格就插入"%20",但是发现在数组中执行插入非常难实现,同时也有较高的复杂度。接下来就会想到是否能够直接定位出每个新元素的位置呢?答案是可以的,但是需要知道每个元素之前有多少个空格,因为一个空格就意味着后面的元素要多往后移动两格。
所以就会先遍历一次字符数组,查看有多少个空格元素,并且求出数组改变之后的长度。接着新建两个指针分别指向原先字符数组的末尾字符和新数组的末尾字符,然后从后往前遍历,直到指针指向数组头部结束(或者指向老数组的指针和新数组的指针重合)
注意:可以新建一个数组,也可以在题目中给出的数组进行操作。
class Solution {
public:
void replaceSpace(char *str,int length) {
//length为字符数组的总容量,并不是字符串的长度
if(str==nullptr || length<=0)
{
return ;
}
int i=0;
int orilength=0;
int numberofspace=0;
while(str[i]!='\0')
{
if(str[i]==' ')
{
numberofspace++;
}
orilength++;
i++;
}
int newlength=orilength+numberofspace*2;
if(newlength>length) return ;
int indexoforiginal=orilength;
int indexofnew=newlength;
while(indexoforiginal>=0 && indexoforiginal<indexofnew)
{
if(str[indexoforiginal]==' ')
{
str[indexofnew--]='0';
str[indexofnew--]='2';
str[indexofnew--]='%';
}
else
{
str[indexofnew--]=str[indexoforiginal];
}
indexoforiginal--;
}
}
};