替换空格

 

 

题目:请实现一个函数,把字符串中的每个空格替换成“%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(包括结尾符号‘\0’),里面有两个空格,因此替换之后字符串的长度是18.

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

移动过程如下图所示:

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

 

举一反三

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

 

posted @ 2018-06-20 10:27  我们都是大好青年  阅读(244)  评论(0编辑  收藏  举报