题目
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
解
由于原书使用c++进行叙述,本题实际意在考察数组操作,像下面这种写法肯定不是题目原意
# -*- coding:utf-8 -*-
class Solution:
# s 源字符串
def replaceSpace(self, s):
# write code here
arr = s.split(" ")
return "%20".join(arr)
原书做法为(python仿写):
class Solution:
# s 源字符串
def replaceSpace(self, s):
# write code here
# 建立数组 (使用list替代)
arr = list(s)
# 记录长度 (原书使用迭代进行空格计数)
num0 = len(arr)
num = arr.count(" ")
# 扩容数组 (realloc函数 或者 预分配大数组长度)
arr += [0, 0] * num
# 建立指针
lp = num0 - 1
rp = len(arr) - 1
# 开始迭代 从后向前
while rp > 0:
if arr[lp] != " ":
arr[rp] = arr[lp]
rp -= 1
else:
arr[rp] = "0"
arr[rp - 1] = "2"
arr[rp - 2] = "%"
rp -= 3
lp -= 1
# 返回字符串
return "".join(arr)
时间复杂度: O(n)【仅考虑元素访问次数】
ps:由于本人是初学python,本例的语言层面的优化可能比较糟糕,我不太清楚list的扩容原理等
要点
在合并两个数组(c字符串)时,如果从前往后复制每个数字(或字符)则需要重复移动数字(字符)多次,那么我们可以考虑从后往前复制,这样就可以减少移动的次数,从而提高效率