题目:将字符串中的空格替换成“%20”;要求时间复杂度为O(n);
分析:常规暴暴力法可以解决这个问题,思路为定义两个下标,一个首下标p,一个尾下标q;首下标p往后跑,遇到空格,尾下标q往前跑,直至与首下标p相等,依次把 把赋给下第两个单元(arr[q+2]=arr[q2],2为空格及“%20”长度的差),此时空出来三位,就依次赋值“2,0,%”,最后q回到现有字符串的最后位置,循序上步骤。这样虽然可以解决问题但是时间复杂度为O(n^2),可不太行。
高效率的方法为:先遍历一遍整个字符串,用计数器保存空格的位数count,下标p保存原字符串尾位置,下标q保存的是扩展的尾下标(n=len+count*2);p依次往前跑,不是空格就把p代表的值赋值q位置,q往前跑一步,p也往前跑一步;p是空格就q往前跑两位,依次赋值赋值“%,0,2”;
char* Change(char str[],int len)
{
int count = 0; int i = 0;
while (str[i]!= '\0')
{
if (str[i] == ' ')count++;
i++;
}
int m = len, n = len + count * 2;
while (m>=0&&m<n)
{
if (str[m] != ' ')
{
str[n] = str[m];
n--;
}
if (str[m] == ' ')
{
str[n--] = '0';
str[n--] = '2';
str[n--] = '%';
}
m--;
}
return str;
}