【剑指offer】面试题四:替换空格
题目:请实现一个函数,把字符串中的每个空格都替换成“%20”。例如输入“We are happy.”,则输出“We%are%20happy.”。
在网络编程中,如果 URL 参数中含有特殊字符,如空格、'#'等,可能导致服务器无法获得正确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。而转换的规则是在 '%' 后面跟上ASCII 码的两位十六进制的表示。比如空格的 ASCII 码为 32,即十六进制的 0x20,因此空格被替换成 “%20”。再比如 ‘#’ 的 ASCII 码为35,即十六进制的 0x23,因此它在 URL 中被替换成 "%23"。
解法一、从前往后的替换方法:
1、 从头到尾遍历字符串,每一次碰到空格字符的时候就做替换。由于是把一个字符(空格)替换成三个字符(“%20”),因此在替换的时候需要把该空格后面的所有字符往后移动两个位置,如果不移动的话,就会出现这种结果:‘%’替换原来的空格,“20”替换空格后面的两个字符。因此会造成字符的覆盖。
2、假设字符串长度为 n,对于每个空格字符,需要移动后面 O(n) 个字符,因此对于含有O(n)个空格字符的字符串而言,时间复杂度为O(n*n)。
具体代码不再赘述。
解法二、从后往前的移动方法,具体思路如下:
1、要想从后往前移动,我们需要知道空格的个数以及被“%20”替换后字符串的总长度,因此需要遍历一次源字符串src。
2、我们从1 得到了被替换后的总长度,此时需要再从后往前遍历一次源字符串。假设当前所访问的字符为ch;
3、如果当前字符 ch 为空格,则需要从后往前替换“%20”;
4、如果 ch 不是空字符,只需将 ch 移动到目标位置即可。
具体代码如下:
1 // replaceSpace.c 2 #include "stdio.h" 3 #include "stdlib.h" 4 #include "string.h" 5 6 #define N 1000 7 8 void replaceSpace(char*str, int sumlen) 9 { 10 if(str == NULL) 11 return; 12 13 char *curptr = str; 14 int srclen = strlen(str); 15 int count = 0; 16 17 while(*curptr != '\0') 18 { 19 if(*curptr == ' ') 20 count++; 21 curptr++; 22 } 23 int destlen = srclen + 2*count; 24 str[destlen] = '\0'; 25 26 int i; 27 for(i = srclen-1; i >= 0; --i) 28 { 29 if(str[i] != ' ') 30 str[--destlen] = str[i]; 31 else 32 { 33 str[--destlen] = '0'; 34 str[--destlen] = '2'; 35 str[--destlen] = '%'; 36 } 37 } 38 } 39 40 int main(int argc, char *argv[]) 41 { 42 char str[N] = {0}; 43 while(gets(str)) 44 { 45 replaceSpace(str, N); 46 printf("dest str: %s\n", str); 47 } 48 return 0; 49 }
注:被替换后字符串的总长度可能很长,因此,我们需要预留一部分空间存储"%20"。我们在上述的代码中设置的为 N=1000
时间复杂度: 由于我们只遍历了一次源字符串就完成了所有字符的替换和移动,因此时间复杂度为 O(n)。
编译于执行:
1 gcc -o replaceSpace replaceSpace.c 2 ./replaceSpace
本文完。