题目:请实现一个函数,把字符串中的每个空格替换成“%20”,例如输入“We are happy.”,则输出“We%20are%20happy.”。
常规考虑时间复杂度为O(n^2),但如果先计算出空格个数,再利用两个指针,时间复杂度可以缩减为O(n)。
void ReplaceBlank(char string[],int length)
{
if(string == NULL && length <= 0)
{
return;
}
int originalLength = 0;
int numberOfBlank = 0;
int i = 0;
while(string[i] != '\0')
{
++originalLength;
if(string[i] == ' ')
{
++numberOfBlank;
}
++i;
}
int newLength = originalLength + numberOfBlank * 2;
if(newLength > length)
{
return;
}
while(originalLength > 0 && newLength > originalLength)
{
if(string[originalLength] == ' ' )
{
string[newLength --] = '0';
string[newLength --] = '2';
string[newLength --] = '%';
}
else
{
string[newLength --] = string[originalLength];
}
--originalLength;
}
}
同理,合并两个字符串或者数组时如果从前往后需要重复移动数字多次,可以考虑从后往前复制。