剑指 Offer 05. 替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

示例 1:

输入:s = "We are happy."
输出:"We%20are%20happy."
 

限制:

0 <= s 的长度 <= 10000

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/ti-huan-kong-ge-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


思考过程:字符串存储的形式是什么,记得是char字符的数组,每个数组单元中存储一个字母(ASCII)码。关键在于找到空格的索引并替换为%20,最笨的就是一个一个遍历,判断是否为空格,如果是空格,则替换为%20(注意这个地方替换的是三个字符,所以新的被替换的字符串长度是源字符串长度的三倍)。这样的时间复杂度就是O(n)。

NOTE:这样题型是一种数组填充类的问题,先预先给数组扩容待添加元素之后的所有元素向后移动。一方面这样不需要重新申请数组,另一方面,不需要不断的移动数组,导致时间复杂度增高。

class Solution:
    def replaceSpace(self, s: str) -> str:
        counter = s.count(' ')
        
        res = list(s)
        # 每碰到一个空格就多拓展两个格子,1 + 2 = 3个位置存’%20‘
        res.extend([' '] * counter * 2)
        
        # 原始字符串的末尾,拓展后的末尾
        left, right = len(s) - 1, len(res) - 1
        
        while left >= 0:
            if res[left] != ' ':
                res[right] = res[left]
                right -= 1
            else:
                # [right - 2, right), 左闭右开
                res[right - 2: right + 1] = '%20'
                right -= 3
            left -= 1
        return ''.join(res)

自己的代码

class Solution:
    def replaceSpace(self, s: str) -> str:
        # 记录字符串中的所有空格数目
        spaceCnt=s.count(' ')
        # 复制s到数列中
        newS=list(s)
        # 原来的1个空格位置再加两个空格
        newS.extend([' '] * spaceCnt * 2)
        # 指向原始字符串的最后一位
        sLeft=len(s)-1
        # 指向扩充后字符串的最后一位
        nsLeft=len(newS)-1
        while sLeft>=0:
            if s[sLeft]==' ':
                newS[nsLeft-2:nsLeft+1]='%20' #
                sLeft-=1
                nsLeft-=3
            else:
                newS[nsLeft]=s[sLeft]
                sLeft-=1
                nsLeft-=1
        return ''.join(newS)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值