zoukankan      html  css  js  c++  java
  • 【剑指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

    本文完。

  • 相关阅读:
    python操作csv,对比两个csv文件某列值
    监控端口和僵尸进程脚本
    openldap创建只读账号
    shell 判断文件内容是否改变
    golang调用shell命令标准输出阻塞管道
    fexpect 源码
    python pexpect 免交互自动恢复gitlab数据
    consul client agent 本地读取key value
    pip 安装三方库报超时
    微信小程序滚动tab的实现
  • 原文地址:https://www.cnblogs.com/xfxu/p/4571153.html
Copyright © 2011-2022 走看看