【剑指offer】Q5_替换空格

4 篇文章 0 订阅
3 篇文章 0 订阅
题目

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

由于原书使用c++进行叙述,本题实际意在考察数组操作,像下面这种写法肯定不是题目原意

# -*- coding:utf-8 -*-
class Solution:
    # s 源字符串
    def replaceSpace(self, s):
        # write code here
        arr = s.split(" ")
        return "%20".join(arr)

原书做法为(python仿写):

class Solution:
    # s 源字符串
    def replaceSpace(self, s):
        # write code here
        # 建立数组 (使用list替代)
        arr = list(s)
        # 记录长度 (原书使用迭代进行空格计数)
        num0 = len(arr)
        num = arr.count(" ")
        # 扩容数组 (realloc函数 或者 预分配大数组长度)
        arr += [0, 0] * num
        # 建立指针
        lp = num0 - 1
        rp = len(arr) - 1
        # 开始迭代 从后向前
        while rp > 0:
            if arr[lp] != " ":
                arr[rp] = arr[lp]
                rp -= 1
            else:
                arr[rp] = "0"
                arr[rp - 1] = "2"
                arr[rp - 2] = "%"
                rp -= 3
            lp -= 1
		# 返回字符串
        return "".join(arr)


时间复杂度: O(n)【仅考虑元素访问次数】
ps:由于本人是初学python,本例的语言层面的优化可能比较糟糕,我不太清楚list的扩容原理等

要点

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值