题目:请实现一个函数,把字符串中的每个空格替换成”%20”。
分析:最简单的就是在弄来一个比已有字符串数组更大的数组,然后复制过,碰到空格就写入“%20”,这样就会浪费内存空间。还有就是从前往后推,碰到空格用”%20”来替代,后面的数组往后挪动,这样的时间复杂度是O(n2)。得找到一个时间复杂度和空间复杂度相对小的方法,书中提供的是从后往前挪动。
代码如下:
#include<stdio.h>
#include<string.h>
void ReplaceBlank(char str[], int length)
{
if(str == NULL && length <= 0)
return;
int originalLength = 0;
int numberOfBlank = 0;
int i = 0;
while(str[i] != '\0')
{
++originalLength;
if(str[i] == ' ')
++numberOfBlank;
++i;
}
int newLength = originalLength + numberOfBlank * 2;
if(newLength > length)
return;
int indexOfOriginal = originalLength;
int indexOfNew = newLength;
while(indexOfOriginal >= 0 && indexOfNew > indexOfOriginal)
{
if(str[indexOfOriginal] == ' ')
{
str[indexOfNew--] = '0';
str[indexOfNew--] = '2';
str[indexOfNew--] = '%';
}
else
str[indexOfNew--] = str[indexOfOriginal];
--indexOfOriginal;
}
}
int main()
{
int i = 0;
const int length = 30;
char str[length];
strcpy(str, " asd sdhd ere fsf!");
for(i = 0; i < sizeof(str)/sizeof(char); i++)
{
printf("%c",str[i]);
}
printf("\n");
ReplaceBlank(str,length);
for(i = 0; i < sizeof(str)/sizeof(char); i++)
printf("%c",str[i]);
printf("\n");
return 0;
}