题目05:替换空格
请实现一个函数,把字符串中的每个空格替换成”%20”
原因:在网络编程中,如果URL参数中含有特殊字符,如:、
#
等,可能导致服务器端无法获得正确的参数值。
我们需要将这些特殊符号转换成服务器识别的字符。转换规则是在%
后面跟上ASCII码的两位十六进制的表。比如:空格的ASCII玛是32,即十六进制的0x20,因此空格被替换成“%20”。
举例说明
例如We are happy.
,则输出We%20are%20happy.
思路–时间复杂度为O(n)的解法
1. 统计空格数目
我们先遍历一次字符串,这样就能够统计出字符串中空格的综述,并可以计算出替换之后字符串的总的长度。
每替换一个空格,长度增加2,因此替换以后的字符串的长度等于原来的长度加上2乘以空格的数目,我们还是以前面的字符串”We are happy”为例,“We are happy”这个字符串的长度是14,里面有两个空格,因此替换之后的字符串的长度为18
2. 尾部开始
我们从字符串的后面开始复制和替换。
- 首先准备两个指针,P1和P2. P1指向原始字符串的末尾,而P2指向替换之后的字符串的末尾。
- 接下来我们向前移动指针P1,逐个把它指向的字符复制到P2指向的位置,直到碰到第一个空格为止。此时字符串如(如图b)所示,灰色阴影的区域是做了字符拷贝的区域。碰到第一个空格之后,把P1向前移动一格,在P2之前插入字符串
%20
,由于%20
的长度为3,同时也要把P2向前移动3格如图所示
我们接着向前复制,直到碰到第二个空格(如图d) 所示。和上一次一样,我们再把P1向前移动1格,并把P2向前移动3格插入”%20“(如图e) - 直到P1,P2指向同一个位置,表明所有的空格都已经替换完毕。
从上面的分析我们可以看出,所有的字符都只复制一次,因此这个算法的时间效率是O(n)
代码实现
1 | public class _05 { |
输出:
1 | 未替换空格时的字符串: |