替换空格

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

思路一:
最直观的做法是从头到尾扫描字符串,每次碰到空格字符的时候进行替换.由于是把1个字符替换成3个字符,我们必须要把空格后面的所有的字符都后移2位,否则就有两个字符要被覆盖了.
假设字符串的长度为n,对每个空格字符,需要移动后面的O(n)个字符,因此对于含有O(n)个空格字符的字符串而言,总的时间效率为 O ( n 2 ) O(n^{2}) O(n2).
那么有没有更节省时间复杂度的方法呢?
思路二:
双指针法.
首先遍历一次这个字符串,记住所有的空格,每遍历到一个空格,就把这个字符串的长度加2(可以通过增加空格或其他特殊字符来增加字符串的长度).当我们遍历完成后,新的字符串的长度就已经确定了.
设计两个指针,p1和p2.其中p1指向字符串的末尾.p2指向新的字符串的末尾.从后到前遍历这个字符串,p1,p2同时向前运动p1指向的元素将被复制到p2指向的元素.直到p1走到空格处为止.这个时候p2继续赋值%, 0和2.然后p1往前走一格,p2往前走一格.按照这个规则复制和赋值,直到p1走到了字符串头部.最后一定能够使得p1和p2会和.

python代码参考如下:

def replaceBlank(string):
	if string == None:
		return -1
    string = list(string)
    size = len(string)
    for i in range(size):
        if string[i] == " ":
            string += "}"
            string += "}"
    length = len(string)
    #p1指向原字符串末尾,p2指向新字符串末尾
    p1 = size - 1
    p2 = length - 1
    while p1 > 0:
        while string[p1] != " ":
            string[p2] = string[p1]
            p1 -= 1
            p2 -= 1
        #这个时候p1在空格处,而p2的位置不必考虑
        string[p2] = "0"
        string[p2-1] = "2"
        string[p2-2] = "%"

        p1 = p1 - 1
        p2 = p2 - 3

    string = "".join(string)
    return string

由于python的字符串是只读的,他不支持分量赋值形式,所以
我只能把string先转换成list类型,再进行值传递时就方便了.边界判断可以是p1 > 0也可以是 p1 < p2.
参考结果:

	string = "I am happy."
    print("原来的字符串是这样的:\n" + string)
    print("经过替换的字符串是这样的:\n" , replaceBlank(string))
    string2 = " i am happy.  "
    print("原来的字符串是这样的:\n" + string2)
    print("经过替换的字符串是这样的:\n" , replaceBlank(string2))

在这里插入图片描述
参见剑指offerP51.
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值