a替换函数 | 豆包MarsCode AI刷题

60 阅读4分钟

题目描述

image.png

我也是佩服我自己天天在这写简单题,主打一个水文章,乐

但是这么道破题怎么水上几百字啊,有点太为难了吧

顺便一提能直接暴力过

题目分析及代码实现

题目要求把字母a换成%100,本质上就是检测到一个东西,就把它换成另一个东西。

学过字符串的朋友们都知道,字符串里有很多实用的函数,能让你完成对字符串的操作。这道题我们唯一会用到的是替换操作。

那么我们简单地先实现一个版本:

def solution(s: str) -> str:
    # 使用 replace 方法将 'a' 替换为 '%100'
    # 注意:replace 方法不会修改原字符串,而是返回一个新的字符串
    result = s.replace('a', '%100')
    return result

if __name__ == '__main__':
    print(solution(s="abcdwa") == '%100bcdw%100')
    print(solution(s="banana") == 'b%100n%100n%100')
    print(solution(s="apple") == '%100pple')

这很好,也很简明快捷。但是,万一有超级长的字符串,让我们的空间复杂度变得过高了怎么办呢?

众所周知,python里面使用replace时,会创建一个新的字符串,但我们不希望每次都创建一个新的字符串,而是在原来的基础上修改,这要怎么实现呢?

答案是使用如 Python 的 list来构建结果字符串,这样可以避免每次替换都创建一个新的字符串。

优化后的代码实现如下:

def solution(s: str) -> str:
    # 使用 list 来构建结果字符串,避免每次替换都创建新的字符串
    result = []
    for char in s:
        if char == 'a':
            result.append('%100')
        else:
            result.append(char)
    return ''.join(result)

if __name__ == '__main__':
    print(solution(s="abcdwa") == '%100bcdw%100')
    print(solution(s="banana") == 'b%100n%100n%100')
    print(solution(s="apple") == '%100pple')

现在对前后的空间复杂度进行对比:

优化前:

  1. 输入字符串 s:假设输入字符串的长度为 n
  2. 每次替换:每次替换 'a' 为 "%100" 都会创建一个新的字符串对象。假设字符串中有 k 个 'a',那么每次替换都会创建一个新的字符串,长度为 n + 3 * k(因为每个 'a' 被替换为 "%100",增加了 3 个字符)。
  3. 总空间复杂度:由于每次替换都会创建一个新的字符串对象,总的空间复杂度为 O(n + 3k),即 O(n)

优化后:

  1. 输入字符串 s:假设输入字符串的长度为 n
  2. 预分配的 list:我们使用一个 list 来存储结果字符串,避免了每次替换都创建新的字符串对象。
  3. 每次替换:每次替换 'a' 为 "%100" 时,直接在 list 中进行修改,不会创建新的字符串对象。
  4. 总空间复杂度:由于我们使用 list 来存储结果字符串,并且在操作过程中没有创建新的字符串对象,总的空间复杂度为 O(n)

前后二者对比:

  1. 内存分配次数

    • 使用 str.replace:每次替换都会创建一个新的字符串对象,导致频繁的内存分配。
    • 使用 list:使用 list 来存储结果字符串,避免了频繁的内存分配。
  2. 内存使用效率

    • 使用 str.replace:由于每次替换都会创建新的字符串对象,内存使用效率较低。
    • 使用 list:直接在 list 中进行修改,内存使用效率较高。
  3. 总空间复杂度

    • 使用 str.replace:总的空间复杂度为 O(n),但由于频繁的内存分配,实际内存使用量可能更高。
    • 使用 list:总的空间复杂度为 O(n),且避免了频繁的内存分配,实际内存使用量更低。

使用 list 可以显著减少空间复杂度,尤其是在处理大字符串时。通过使用 list 来存储结果字符串,并在操作过程中直接修改该 list,可以避免频繁的内存分配,从而提高内存使用效率。