第一种:

思路:

遍历一个字符串,遇到空格向后移动三个char空间,插入%20,直到遍历结束。

时间复杂度O(n^2)

空间复杂度O(1)

#include<iostream>#include<stdlib.h>#include<assert.h>usingnamespacestd;voidmemmove(void*src,void*des,size_tsize){char*d=(char*)des;char*s=(char*)src;if((s-d>0)&&(s-d<size)){while(size--){s[size-1]=d[size-1];}}else{inti=0;while(i<size){s[i]=d[i];i++;}}}voidReplace(char*s){assert(s);while(*s){if(*s!=''){s++;}else{memmove(s+3,s+1,strlen(s+1)+1);*s++='%';*s++='2';*s='0';}}}intmain(){chars[30]="weareyoung";Replace(s);cout<<s<<endl;system("pause");return0;}

结果:


第二种:

思路:如果面试官允许开辟新的空间,则利用两个指针*s,*str分别指向原字符串,新字符串的首部,

依次遍历原字符串,字符不是空格,就将*s赋值给*str,如果遇到空格,向新字符串中插入%20,直到原字符串遍历结束。

时间复杂度O(n)

空间复杂度O(n)

#include<stdio.h>#include<stdlib.h>#include<string.h>voidReplace(char*s,char*str){while(*s){if(*s!=''){*str=*s;str++;}else{strcpy(str,"%20");str=str+3;}s++;}*str='\0';}intmain(){chars[]="weareyoung";charstr[30];Replace(s,str);printf("%s\n",str);system("pause");return0;}第三种:思路:先遍历一遍字符数组,计算空格数量,定义两个指针p1,p2,一个指向原字符串的末尾,一个变化后的字符串末尾,p1从尾向头遍历,依次把值赋给p2,p1遇到空格时,在p2所指向的位置插入“%20”。代码:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<assert.h>voidInsert(char*str,intlen){assert(str);intnewlength=len+1;inti=0;while(str[i]!='\0'){if(str[i]==''){newlength+=2;}i++;}char*p1=str+len;char*p2=str+newlength-1;while(p1!=str){if(*p1==''){p2-=2;strncpy(p2,"%20",sizeof(char)*3);}else{*p2=*p1;}p1--;p2--;}}intmain(){chars[30]="weareyoung";Insert(s,strlen(s));printf("%s\n",s);system("pause");return0;}