目录

  • 题目:请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入"We are happy.",则输出"We%20are%20happy."。
  • 思路:从字符串后面移动和替换
  • Code
  • 其他方法
  • python内置函数
  • 正则表达式
  • 总结


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

思路:从字符串后面移动和替换

首先遍历一次字符串统计出字符串中空格的总数,并可以由此计算出替换之后的字符串的总长度。每替换一个空格,长度增加2,因此替换以后字符串的长度等于原来的长度加上2乘以空格数目。以字符串"We are happy."为例,"We are happy."这个字符串的长度是14(包括结尾符号’\0’),里面有两个空格,因此替换之后字符串的长度是18。

我们从字符串的后面开始复制和替换。首先准备两个指针,P1和P2。P1指向原始字符串的末尾,而P2指向替换之后的字符串的末尾(如图(a)所示)。接下来我们向前移动指针P1,逐个把它指向的字符复制到P2指向的位置,直到碰到第一个空格为止。此时字符串包含如图(b)所示,灰色背景的区域是做了字符拷贝(移动)的区域。碰到第一个空格之后,把P1向前移动1格,在P2之前插入字符串"%20"。由于"%20"的长度为3,同时也要把P2向前移动3格如图©所示。

我们接着向前复制,直到碰到第二个空格(如图(d)所示)。和上一次一样,我们再把P1向前移动1格,并把P2向前移动3格插入"%20" (如图(e)所示)。此时P1和P2指向同一位置,表明所有空格都已经替换完毕。

Python df 空值填充 python空格填充剩余位置_python

从上面的分析我们可以看出,所有的字符都只复制(移动)一次,因此这个算法的时间复杂度是O(n)

Code

实现代码如下:

def replace(s):
    blank_num = s.count(' ') #用python内置函数统计空格个数
    #blank_num = len([i for i in list(s) if i == ' '])#循环遍历每个字符求空格个数

    old_str = list(s)
    new_len = len(s) + 2 * blank_num
    new_str = new_len * [None]
    p1,p2 = len(s)-1,new_len-1
    while p1 <= p2 and p2 >= 0:
        if old_str[p1] == ' ':
            new_str[p2 - 2:p2 + 1] = list("%20")
            p1 -= 1
            p2 -= 3
        else:
            new_str[p2] = old_str[p1]
            p1 -= 1
            p2 -= 1
    return ''.join(new_str)
s = 'We are happy.'
print(replace(s))

其他方法

python内置函数

# 在Python中str类型是不可变的类型, 使用replace语句会生成一个新的str, 原始的s还是带空格的str变量
print('We are happy.'.replace(' ', '20%'))

正则表达式

import re
ret = re.compile(' ')
print(ret.sub('20%', 'We are happy.'))

总结

如果是从头到尾遍历字符串,每碰到一个空格字符的时候移动后面的字符,此时的时间复杂度是O(n^2)。