实现一个函数,把字符串中的每个空格替换成“%20”.例如:输入“We are happy.”,则输出“We%20are%20happy.”
若从头到尾扫描字符串,每次遇到一个空格替换时,都需要将后面的字符都后移两位,总的时间复杂度为O(n^2).
为减少时间复杂度,可以先遍历一遍计算出总的空格数,则替换空格后的字符串总长度等于原来的长度加上2乘空格数。p2指向替换后的字符串尾部,p1指向原字符串尾部,从后向前遍历。总的时间复杂度为O(n)。(字符数组的总容量要足够大)
void Replace(char str[], int len)//len为字符数组的总容量
{
if (NULL == str || len <= 0) return;
int i = 0;
int strsize = 0;//字符串有效长度
int count = 0;//空格数
while (str[i] != '\0')
{
++strsize;
if (' ' == str[i]) ++count;
++i;
}
int p1 = strsize;
int p2 = strsize + count * 2;
while (p1 >= 0 && p2 > p1)
{
if (' ' == str[p1])
{
str[p2--] = '0';
str[p2--] = '2';
str[p2--] = '%';
}
else
{
str[p2--] = str[p1];
}
p1--;
}
}