该题我第一感觉 就是用空间换时间
然后海涛的思路就是用两个指针 先计算所需空间 然后从后往前拷贝,这样可以达到O(n)
#include "stdio.h"
#include "string.h"
int main()
{
char str[1024] = "my hobby is hello";
int len = strlen(str);
char temp[1024];
char rep[]="%20";
char *p1,*p2;
char ch;
int count =0;
int i=0;
int total;
temp[0]=0;
printf("%d",sizeof(str));
/*method1使用sprintf函数,占用另外空间*/
for(i=0;i<len;i++)
{
if(str[i] != ' ')
{
sprintf(temp+strlen(temp),"%c",str[i]);
}
else
{
sprintf(temp+strlen(temp),"%s","\%20");
}
}
printf("%s\n",str);
printf("%s\n",temp);
/*method2使用数组移动来解决问题*/
for(i=0;i<len;i++)
{
if(str[i]==' ')
{
count++;
}
}
printf("%s\n",str);
if(count>0)
{
total = strlen(str)+1+count*2;
p1 = str+strlen(str);
p2 = str+total-1;
while((p1-str)>=0)
{
if(*p1 != ' ')
{
*p2=*p1;
p1-=1;
p2-=1;
}
else
{
*p2--='0';
*p2--='2';
*p2--='%';
p1-=1;
}
}
}
printf("%s\n",str);
return 0;
}
代码不是很难,只要细心就好~