Skip to content

Latest commit

 

History

History
28 lines (20 loc) · 2.45 KB

02剑指offer04.md

File metadata and controls

28 lines (20 loc) · 2.45 KB

题目:请实现一个函数,将一个字符串中的空格替换成"%20"。例如:当字符串为We are Happy,则经过替换之后的字符串为We%20Are%20Happy。

在线测试平台:http://ac.jobdu.com/problem.php?pid=1510


题目背景

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


前提条件

原来一个空格字符,替换之后变为了3个字符,因此会导致字符串变长。因此我们有两种方案:

  • 在原来的字符串上做替换,但要保证字符串后面有足够的内存。
  • 新建一个字符串,并分配足够的内存,来存储替换后的字符串。

我们采用在原来的字符串上做替换的方案。


方法分析

时间复杂度为O(n^2)的方法

如果我们从字符串中的第一个空格开始替换,每替换一个空格就将后面的所有字符串后移两位。对于这种方法,假设字符串的长度为n,对于每个空格字符,需要移动后面的O(n)个字符,因此对含有O(n)个空格字符的字符串而言总的时间复杂度为O(n^2)。

时间复杂度为O(n)的方法

我们可以先遍历一次字符串,统计出字符串中空格的个数,从而可以计算出替换后字符串的总长度(原来字符串长度+2*空格数目)。
然后从字符串的末尾开始替换。准备两个指针(字符串数组的index)P1和P2,P1指向原始字符串的末尾,P2指向替换后字符串的末尾(注意末尾指的是\0的位置)。接下来向前移动P1,逐个将P1指向的字符串复制到P2指向的位置,直到碰到第一个空格为止。碰到第一个空格之后,将P1向前移动一个格,P2在前面三个格中填入"%20"并先前移动三个格。
当P1和P2指向的位置相同时,说明P1指针前面的字符串中已经没有空格可以替代了,则可以结束替代过程。
在此种方法中,所有的字符都指移动了一次,因此时间复杂度为O(n)。