• 替换空格


    题目:请实现一个函数,把字符串中的每个空格替换成“%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),比第一个思路要快。

    举一反三

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

  • 相关阅读:
    iTerm2分屏快捷键
    k8s中运维/测试常用的命令整理(随时更新)
    httpRunner自动化测试用例使用笔记
    Git学习笔记-快速上手(mac系统)
    RBAC权限控制逻辑笔记
    CPS中有关CICD的配置
    LDAP中filter的使用
    Docker初级入门
    C语言 实现 HashTable
    从三个线程 排队打印 , 到 多个线程打印
  • 原文地址:https://www.cnblogs.com/zhibei/p/9202539.html
Copyright © 2020-2023  润新知