题目:
请实现一个函数,把字符串中的每一个空格替换成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”
看到这道题目,我们最开始的思路肯定是从头到尾扫描字符串,遇到空格就将它与%20相替换。但是由于是一个字符替换成3个字符,那么我们就必须将空格后面所有的字符都后移2个字节,如此算来,时间复杂度会是n^2。
如何减少时间复杂度呢?首先我们可以先遍历一遍字符串,获得字符串的总长和空格数,然后我们就知道新的字符串的长度是多少,接着我们从字符串的后面开始复制和替换。
如何复制和替换呢?很简单,我们已经知道了原字符串的长度和新的字符串的长度,那么我们准备2个指针P1,P2,分别指向原字符串的尾部和新字符串的尾部,将P1的内容复制到P2处,如果P1为空格,P2分别添加‘0’‘2’‘%’当P1、P2指向同一个位置的时候,就说明所有的空格都替换完毕啦。
如图所示:
代码实现:
void ReplaceBlank(char str[],int length)
//length is the len of str[]
{
if(str==nullptr||length<=0)
return;
int original_len=0;
int blank_num=0;
int i=0;
while(str[i]!='\0')
{
original_len++;
if(str[i]==' ')
blank_num++;
i++;
}
int new_len=original_len+blank_num*2;
int original_index=original_len;
int new_index=new_len;
while(original_index>=0&&new_index>original_index)
{
if(str[original_index]==' ')
{
str[new_index--]='0';
str[new_index--]='2';
str[new_index--]='%';
}else{
str[new_index--]=str[original_index];
}
original_index--;
}
}
我们可以看出,虽然前面要先遍历一遍,但是我们这个算法的时间复杂度是O(n)。