第一种:
思路:
遍历一个字符串,遇到空格向后移动三个字符空间,插入% 20,直到遍历结束。
时间复杂度O (n ^ 2)
空间复杂度O (1)
# include# include # include using namespace 性传播疾病; void memmove (void *, src, void *, des, size_t 大小) { char *, d=des (char *); char *, s=src (char *); 如果((s-d> 0),和(s-d<,大小) { 而(大小) { s[大小是1]=d(大小); } } 其他的 { int i=0; 而(i<大小) { s[我]=d[我]; 我+ +; } } } void 取代(char *, s) { 断言(年代); 而(*) { 如果(*年代!=',') { s + +; } 其他的 { memmove才能(s + 3, + 1, strlen (s + 1) + 1); ,,* s + +=?’; ,,* s + +=' 2 '; * s=' 0 '才能; } } } int main () { char s[30]="断开连接,我方表示歉意,年轻”; 替换(年代); cout<& lt; s<& lt; endl; 系统(“暂停”); return 0; }
结果:
第二种:
思路:如果面试官允许开辟新的空间,则利用两个指针*,* str分别指向原字符串,新字符串的首部,
依次遍历原字符串,字符不是空格,就将*年代赋值给* str,如果遇到空格,向新字符串中插入% 20,直到原字符串遍历结束。
时间复杂度O (n)
空间复杂度O (n)
# include# include # include void 取代(char *,年代,char *, str) { 而(*) { 如果(*年代!=',') { * str=*年代; str + +; } 其他的 { % 20“strcpy (str); str=str + 3; } s + +; } * str=' \ 0 '; } int main () { char s[]=岸峡游曳奖硎厩敢?年轻”; char str [30]; 替换(年代,str); printf (" % s \ n ", str); 系统(“暂停”); return 0; } 第三种: 思路: 先遍历一遍字符数组,计算空格数量,定义两个指针p1, p2,一个指向原字符串的末尾,一个变化后的字符串末尾,p1从尾向头遍历,依次把值赋给p2, p1遇到空格时,在p2所指向的位置插入“% 20”。 代码: # include # include # include # include void 插入(char *, str, int 兰) { 断言(str); int newlength=len + 1; int i=0; 而(str[我]!=' \ 0 ') { ,,,,,,如果(str[我]==',') ,,{ ,,newlength +=2; ,,} ,,我+ +; } char *, p1=str +兰; char *, p2=str + newlength-1; 而(p1 !=str) { 如果(* p1==', ') { ,,p2 -=2; strncpy (p2,“% 20”, sizeof (char) * 3); } 其他的 { * p2=* p1; } p1 -; p2 -; } } int main () { char s[30]=岸峡游曳奖硎厩敢?年轻”; 插入(年代,strlen (s)); printf (" % s \ n ", s); 系统(“暂停”); return 0; }