题目大意是这样的:有一个字符串"we are happy"将其中的空格替换成"%20"然后输出是“we%20are%20happy”即可。
这个题一般有这样的解法,一个是将字符串进行轮训,遇到一个空格,将空格后的字符向后挪2个字符,然后插入%20即可,然后继续轮训到下一个空格,再将空格后的字符串向后挪2位,等等,一直到所有的空格都被替换。这个算法的复杂度为O(N2)。
另一个解法,将字符串先轮训一遍,然后计算出空格的数量,得到最后字符串的长度,然后从后往前,一次性将字符挪到位,那么就降低了算法的复杂度。看代码吧
#include <iostream>
#include <string.h>
using namespace std;
char* fillBlank(char *src)
{
int space = 0;
char* tmp = src;
while(*tmp++ != '\0')
{
if (*tmp == ' ')
space++;
}
int length = strlen(src);
int end = length+space*2;
char* p1 = src+length;
char* p2 = src+end;
while(p1 != p2)
{
if (*p1 != ' ')
*p2-- = *p1--;
else
{
p1--;
*p2-- = '0';
*p2-- = '2';
*p2-- = '%';
}
}
return src;
}
int main()
{
char arr[30] = "we are happy";
cout<<fillBlank(arr)<<endl;
return 0;
}
后者的时间复杂度为O(N).