zoukankan      html  css  js  c++  java
  • 替换空格

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

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

    时间复杂度为O(n^2)的解法(最初想到的),不足以拿到Offer

    即最直观的做法是从头到尾扫描字符串,每一次碰到空格字符的时候做替换。由于是把1个字符替换为3个字符,我们必须要把空格后面所有的字符都后移两个字节,否则就有两个字符被覆盖了;

    移动过程如下图所示:

    替换第一个空格是,这个字符串变成图(b)中的内容,变革中灰色背景的格子表示需要做移动的区域。接着我们替换第二个空格,替换之后的内容如图(c)所示。同时,我们注意到用深色北京标注的‘happy’部分被移动了两次。

    时间复杂度O(n)的解法,搞定Offer就靠它了

    我们可以先遍历一次字符串,这样就能统计出字符串中空格的总数,并可以由此计算出替换之后的字符串的总长度。每替换一个空格,长度增加2,因此替换后的字符串的长度等于原来长度加上 2*空格数目。体重字符串的长度是14(包括结尾符号‘’),里面有两个空格,因此替换之后字符串的长度是18.

    我们从字符串的后面开始复制和替换。首先准备两个指针,P1和P2。P1指向原始字符串的末尾,而P2执行替换之后的字符串的末尾,接下来向前移动指针P1,逐个把它指向的字符串复制到P2指向的位置,直到碰到第一个空格为止。碰到第一个空格后,把P1向前移动1格,在P2之前插入字符串“%20”,由于“%20”的长度为3,同时也要把P2向前移动3格。

    移动过程如下图所示:

    从上面的分析我们可以看出,所有的字符只复制(移动)一次,因此这个算法的时间效率是O(n),比第一个思路要快。

    举一反三

    合并两个数组(包括字符串)时,如果从前往后复制每个数字(或字符)需要重复移动数字(或字符)多次,那么我们可以考虑从后往前复制,这样就能减少移动的次数,从而提高效率。

  • 相关阅读:
    Day 20 初识面向对象
    Day 16 常用模块
    Day 15 正则表达式 re模块
    D14 模块 导入模块 开发目录规范
    Day 13 迭代器,生成器,内置函数
    Day 12 递归,二分算法,推导式,匿名函数
    Day 11 闭包函数.装饰器
    D10 函数(二) 嵌套,命名空间作用域
    D09 函数(一) 返回值,参数
    Day 07 Day08 字符编码与文件处理
  • 原文地址:https://www.cnblogs.com/zhibei/p/9202539.html
Copyright © 2011-2022 走看看