【剑指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 != '')
18     {
19        if(*curptr == ' ')
20            count++;
21        curptr++;
22     }
23     int destlen = srclen + 2*count;
24     str[destlen] = '';
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
", str);
47     }
48     return 0;
49 }
View Code
注:被替换后字符串的总长度可能很长,因此,我们需要预留一部分空间存储"%20"。我们在上述的代码中设置的为 N=1000

时间复杂度: 由于我们只遍历了一次源字符串就完成了所有字符的替换和移动,因此时间复杂度为 O(n)。

编译于执行:

1 gcc -o replaceSpace replaceSpace.c
2 ./replaceSpace

本文完。

原文地址:https://www.cnblogs.com/xfxu/p/4571153.html