题目描述
我也是佩服我自己天天在这写简单题,主打一个水文章,乐
但是这么道破题怎么水上几百字啊,有点太为难了吧
顺便一提能直接暴力过
题目分析及代码实现
题目要求把字母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')
现在对前后的空间复杂度进行对比:
优化前:
- 输入字符串
s:假设输入字符串的长度为n。 - 每次替换:每次替换
'a'为"%100"都会创建一个新的字符串对象。假设字符串中有k个'a',那么每次替换都会创建一个新的字符串,长度为n + 3 * k(因为每个'a'被替换为"%100",增加了 3 个字符)。 - 总空间复杂度:由于每次替换都会创建一个新的字符串对象,总的空间复杂度为
O(n + 3k),即O(n)。
优化后:
- 输入字符串
s:假设输入字符串的长度为n。 - 预分配的
list:我们使用一个list来存储结果字符串,避免了每次替换都创建新的字符串对象。 - 每次替换:每次替换
'a'为"%100"时,直接在list中进行修改,不会创建新的字符串对象。 - 总空间复杂度:由于我们使用
list来存储结果字符串,并且在操作过程中没有创建新的字符串对象,总的空间复杂度为O(n)。
前后二者对比:
-
内存分配次数:
- 使用
str.replace:每次替换都会创建一个新的字符串对象,导致频繁的内存分配。 - 使用
list:使用list来存储结果字符串,避免了频繁的内存分配。
- 使用
-
内存使用效率:
- 使用
str.replace:由于每次替换都会创建新的字符串对象,内存使用效率较低。 - 使用
list:直接在list中进行修改,内存使用效率较高。
- 使用
-
总空间复杂度:
- 使用
str.replace:总的空间复杂度为O(n),但由于频繁的内存分配,实际内存使用量可能更高。 - 使用
list:总的空间复杂度为O(n),且避免了频繁的内存分配,实际内存使用量更低。
- 使用
使用 list 可以显著减少空间复杂度,尤其是在处理大字符串时。通过使用 list 来存储结果字符串,并在操作过程中直接修改该 list,可以避免频繁的内存分配,从而提高内存使用效率。