剑指_5替换空格(Python)

题目描述:

  • 实现一个函数,把字符串中的每一个空格替换为“%20”。
  • 例如,输入“we are happy.” ,则输入“we%20are%20happy.”

题目分析:

对题目的分析:

  • 题目初始分析,首先想到将初始的一个空格字符,替换之后变成‘%’、‘2’、‘0’ 3个字符,故字符串整体是变长的
  • 如果在原始字符串上替换的话,就有可能修改字符串后面的字符内存
  • 如果是创建一个新的字符串,我们就可以申请足够的内存来进行替换
  • 若是面试官要求我们在初始字符串上去修改的话,我们有一下的思路

一些想法:

  • 最直观的做法就是,从头到尾扫描一遍,每次碰到一个空格,就去替换,
  • 但由于是将一个字符替换为3个字符,所以空格后面的字符串要全部后移2位
  • 即就是有几个空格,我们就要将其后面的字符后移几次。
  • 假设字符串的长度是n,对每一个空格字符串,需要移动后面的 O(n) 个字符,若是含有 O(n) 个空格,则 时间复杂度是 O(n^2)
  • 显然这样不是最好的做法。

详细思路:

  • 我们先遍历整个字符串,统计字符串中的空格的个数,由此可以计算最后新的字符串的长度。
  • 每次替换一个空格,长度增加2,所以 新字符串的长度等于初始长度加上2乘以空格个数
  • 我们从字符串的后面开始赋值和替换。指定两个指针ij,i指向初始字符串的末尾,j指向新的字符串的末尾。
  • 依次将i指针指向的元素复制给j指针对应的元素,直至指针i遇到空格
  • 把指针i左移,指针j对应的元素替换为“%20”’,再把指针j左移3位。
  • 如此重复直至遍历所有的字符串。

代码实现:

class Solution:
    def replaceblank(self,char):
        if char == None or len(char) <= 0:   # 排序无效字符串和空字符串
            return False
        count = 0            # 计数变量
        for i in range(len(char)):   # 遍历,统计空格个数
            if char[i] == ' ':
                count += 1
        char_new = char + ' '*2*count    # 新的字符串
        i = len(char)-1        # 初始字符串的尾指针
        j = len(char_new) -1    # 新字符串的尾指针

        char_new = list(char_new)   # 由于字符串不能执行赋值操作,转为list
        while i >= 0:
            if char_new[i] != ' ':        # 指针 i 未指向空格时,将 i 的值赋值给 j
                char_new[j] = char_new[i]
                i -= 1
                j -= 1
            else:              # 指针 i 指向空格时: i-1 ,给 [j-2:j+1]赋值‘%20’,并左移三位
                i -= 1
                char_new[j-2:j+1] = '%20'
                j -= 3
        return ''.join(char_new)    # 再转化为字符串

if __name__ == '__main__':

    # 验证:
    
    # 输入字符串包含空格(空格在最右边;在最左边;在中间;有连续多个)
    test_1 = 'wearehappy '
    test_2 = ' wearehappy'
    test_3 = 'we are happy'
    test_4 = 'we    are happy'
    
    # 输入字符串中没有一个空格
    test_5 = 'wearehappy'

    # 特殊输入测试(无效的字符串;空字符串;字符串只有一个空格;字符串中有连续空格)
    test_6 = None
    test_7 = ''
    test_8 = ' '
    test_9 = '    '
    
    solution = Solution()
    print("test_1:", solution.replaceblank(test_1))
    print("test_2:", solution.replaceblank(test_2))
    print("test_3:", solution.replaceblank(test_3))
    print("test_4:", solution.replaceblank(test_4))
    print("test_5:", solution.replaceblank(test_5))
    print("test_6:", solution.replaceblank(test_6))
    print("test_7:", solution.replaceblank(test_7))
    print("test_8:", solution.replaceblank(test_8))
    print("test_9:", solution.replaceblank(test_9))

验证结果:

test_1: wearehappy%20
test_2: %20wearehappy
test_3: we%20are%20happy
test_4: we%20%20%20%20are%20happy
test_5: wearehappy
test_6: False
test_7: False
test_8: %20
test_9: %20%20%20%20

复杂度分析:

时间复杂度:

上述代码空格替换为%20可以忽略不计,主要的花费在遍历字符串中。,因此时间复杂度是 O(n)

空间复杂度:O(1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值