【题目】实现一个函数,把字符串中的每个空格替换成“%20”。输入”we are happy.”, 输出 “we%20are%20happy.”
【分析】从头到尾扫描字符串,遇到空格就替换,导致后面的字符都要向后移,意味着总时间复杂度为O(n^2), 更好的办法,从字符串后面遍历替换。先遍历所有的空格,每多一个空格,字符串长度加2个,也就是说最后替换后的字符串长度为原长度+2*空格数,设置两个指针,指向原始字符串末尾和新字符串末尾,依次向前遍历,原始字符串指针遇到空格,那么新字符串指针就做相应替换和迁移,直到两指针重合,说明空格替换完毕。时间复杂度O(n)。
【算法代码】
#include<stdio.h>
void ReplaceBlank(char string[ ], int length)
{
if(string == NULL || length <= 0)
return ;
int original_length = 0;
int number_blank = 0;
int i =0 ;
while( string[ i ] != '\0' )
{
++original_length;
if(string[ i ] == ' ')
++number_blank;
++i;
}
int new_length = original_length + number_blank*2;
if (new_length > length)
return;
int index_of_original = original_length;
int index_of_new = new_length;
while(index_of_original >= 0 && index_of_new > index_of_original)
{
if(string[index_of_original] == ' ')
{
string[index_of_new--] = '0';
string[index_of_new--] = '2';
string[index_of_new--] = '%';
}
else
string[index_of_new--] = string[ index_of_original ];
--index_of_original ;
}
}
int main()
{
int length = 100;
char string[length ] = "we are happy.";
char *p = string;
ReplaceBlank(string, length);
printf("%s",string);
return 0;
}