剑指Offer之替换空格(题4)

简介:

一.概述:

面试题4:替换空格 

题目:请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are happy.”,则输出“We%20are%20happy.”。 

在网络编程中,如果URL参数中含有特殊字符,如空格、'#'等,可能导致服务器端无法获得正确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。转换的规则是在'%'后面跟上ASCII码的两位十六进制的表示。比如空格的ASCII码是32,即十六进制的0x20,因此空格被替换成"%20"。再比如'#'的ASCII码为35,即十六进制的0x23,它在URL中被替换为"%23"。 

看到这个题目,我们首先应该想到的是原来一个空格字符,替换之后变成'%'、'2'和'0'这3个字符,因此字符串会变长。如果是在原来的字符串上做替换,那么就有可能覆盖修改在该字符串后面的内存。如果是创建新的字符串并在新的字符串上做替换,那么我们可以自己分配足够多的内存。由于有两种不同的解决方案,我们应该向面试官问清楚,让他明确告诉我们他的需求。假设面试官让我们在原来的字符串上做替换,并且保证输入的字符串后面有足够多的空余内存。




二.解法一:时间复杂度为O(n^2)



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/****************************************                                                                                                 
   2     > File Name:test.c
   3     > Author:xiaoxiaohui
   4     > mail:1924224891@qq.com
   5     > Created Time:2016年05月13日 星期五 11时44分28秒
   6 ****************************************/
  
   8 #include<stdio.h>
  
  10  void  ReplaceBlank( char * src)
  11 {
  12      if (src == NULL)
  13     {
  14          return ;
  15     }
  16      int  length = 0;        //src的长度
  17      int  newLength = 0;    //改变空格之后的长度
  18      int  count = 0;       //空格的个数
  19      char * left = src;
  20      char * right = NULL;
  21 
  22      while (*left !=  '\0' )
  23     {
  24         length++;
  25          if (*left ==  ' ' )
  26         {
  27             count++;
  28         }
  29         left++;
  30     }
  31 
  32     newLength = length + 2*count + 1;
  33     right = src + (newLength - 1);
  34     left = src + length - 2;
  35 
  36      while (left != right)
  37     {
  38          while (*left !=  ' ' )
  39         {
  40             *right = *left;
  41          //  left--;
  42          //  right--;
  43         }
  44 
  45         left--;
  46         
  47         *right =  '0' ;
  48         right--;
  49         *right =  '2' ;
  50         right--;
  51         *right =  '%' ;
  52         right--;
  53     }
  54 
  55      printf ( "%s" , src);
  56 }
  57 
  58





三.解法二:时间复杂度为O(n)



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
  /****************************************                                                                                                 
   2     > File Name:test1.c
   3     > Author:xiaoxiaohui
   4     > mail:1924224891@qq.com
   5     > Created Time:2016年05月13日 星期五 10时49分14秒
   6 ****************************************/
  
   8 #include<stdio.h>
   9 #include<string.h>
  10 
  11  void  change( char * src)
  12 {
  13      char * start = src;
  14      char * end = src;
  15      int  count = 0;
  16      while (*start !=  '\0' )
  17     {
  18          while (*start !=  ' '  && *start !=  '\0' )
  19         {
  20             start++;
  21         }
  22     
  23         end = start;
  24          while (*end ==  ' '  && *end !=  '\0' )
  25         {
  26             count++;
  27             end++;
  28         }
  29     
  30          while (count--)
  31         {
  32              strncat (start,  "%20" , 3);
  33             start += 3;
  34         }
  35     
  36          strcat (start,end);
  37     }
  38      printf ( "%s" , src);
  39 }
  40 
  41  int  main()
  42 {
  43      char * str =  "we are happy" ;
  44     change(str);
  45 }









本文转自 ye小灰灰  51CTO博客,原文链接:http://blog.51cto.com/10704527/1783630,如需转载请自行联系原作者
目录
相关文章
|
4月前
|
存储
【剑指offer】-左旋转字符串-41/67
【剑指offer】-左旋转字符串-41/67
|
4月前
|
Java
每日一题《剑指offer》字符串篇之替换空格
每日一题《剑指offer》字符串篇之替换空格
31 0
每日一题《剑指offer》字符串篇之替换空格
|
7月前
剑指offer-4.替换空格
剑指offer-4.替换空格
18 0
|
10月前
|
存储 C++
剑指offer 04. 替换空格
剑指offer 04. 替换空格
47 0
|
10月前
|
C++
剑指Offer - 面试题5:替换空格
剑指Offer - 面试题5:替换空格
51 0
|
10月前
|
机器学习/深度学习 C++
剑指offer 66. 左旋转字符串
剑指offer 66. 左旋转字符串
54 0
|
12月前
|
算法 API
LeetCode:剑指Offer 05. 替换空格 (字符串)
题目描述:请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
|
算法 Java C++
替换空格(剑指offer 05)
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
|
Java Python
左旋转字符串(剑指offer 58-II)
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
leetcode 剑指offer05 替换空格
leetcode 剑指offer05 替换空格
58 0
leetcode 剑指offer05 替换空格