第一种:
思路:
遍历一个字符串,遇到空格向后移动三个char空间,插入%20,直到遍历结束。
时间复杂度O(n^2)
空间复杂度O(1)
#include<iostream> #include<stdlib.h> #include<assert.h> using namespace std; void memmove(void* src,void* des,size_t size) { char* d=(char*)des; char* s=(char*)src; if((s-d>0)&&(s-d< size)) { while(size--) { s[size-1]=d[size-1]; } } else { int i=0; while(i<size) { s[i]=d[i]; i++; } } } void Replace(char* s) { assert(s); while(*s) { if(*s!=‘ ‘) { s++; } else { memmove(s+3,s+1,strlen(s+1)+1); *s++=‘%‘; *s++=‘2‘; *s=‘0‘; } } } int main() { char s[30]="we are young"; Replace(s); cout<<s<<endl; system("pause"); return 0; }
结果:
第二种:
思路:如果面试官允许开辟新的空间,则利用两个指针*s,*str分别指向原字符串,新字符串的首部,
依次遍历原字符串,字符不是空格,就将*s赋值给*str,如果遇到空格,向新字符串中插入%20,直到原字符串遍历结束。
时间复杂度O(n)
空间复杂度O(n)
#include<stdio.h> #include<stdlib.h> #include<string.h> void Replace(char* s,char* str) { while(*s) { if(*s!=‘ ‘) { *str=*s; str++; } else { strcpy(str,"%20"); str=str+3; } s++; } *str=‘\0‘; } int main() { char s[]="we are young"; char str[30]; Replace(s,str); printf("%s\n",str); system("pause"); return 0; }
本文出自 “liveyoung” 博客,转载请与作者联系!
原文地址:http://10707042.blog.51cto.com/10697042/1769455