面试题5:替换空格

剑指 Offer 05. 替换空格

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

示例 1:

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

限制:

0 <= s 的长度 <= 10000

这道题题意很简单,就是替换所有的空格,不过不是等量替换,而是将一个字符替换成三个字符,如果是c语言的话,就要重新分配新的空间,而且后面的字符要全部后移,难点就来了,如果直接从前到后遍历,遍历到一个空格就扩展一次,后移一次,替换一次。

当然解出题肯定可以解出来,但是不一定能拿到offer,因为这种解法在一个字符串中每次替换都要移动O(n)大小的字符,所以在一个字符串中有O(n)个空格的情况下,时间复杂度就会大到O(n^2)

作者给出的解法是双指针法,先遍历一遍字符串,找出所有的空格,然后×2就是扩展的字符串的大小,扩展好之后,将字符串中两个指针从后往前扫描,前指针发现非空格,就复制这个字符到后指针的位置,并且双向前移,当前指针发现空格时,后指针就向前写%20这三个字符,依次这样下去。

当然python是有对应的库函数的replace,字符串也没有大小限制,当然为了顺应面试官的想法,也可以用python模仿下作者的双指针解法。

题解一:库函数replace替换法

def replaceSpace(self, s):
    """
    :type s: str
    :rtype: str
    """
    return s.replace(" ","%20")

题解二:双指针遍历法

def replaceSpace(self, s):
    """
    :type s: str
    :rtype: str
    """
    
    if len(s) == 0:
        return s
    len_space = 0

    s = list(s)
    for i in range(len(s)):
        if s[i] == " ":
            len_space = len_space + 1
    if len_space == 0:
        pass
    else:
        pre = len(s) - 1
        for i in range(len_space):
            s.append(" ")
            s.append(" ")
        low = len(s) - 1
        while(pre >= 0 and low >= 0):
            if s[pre] == " ":
                s[low] = "0"
                s[low-1] = "2"
                s[low-2] = "%"
                low = low - 3
                pre = pre - 1
                continue
            elif s[pre] != " ":
                s[low] = s[pre]
                pre = pre - 1
                low = low - 1
                continue
    return "".join(s)

上一篇:学习笔记-使用Python对含有椒盐噪声的图像进行均值滤波,高斯滤波和中值滤波


下一篇:基于python的空域变换