请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = "We are happy."
输出:"We%20are%20happy."
限制:
0 <= s 的长度 <= 10000
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/ti-huan-kong-ge-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思考过程:字符串存储的形式是什么,记得是char字符的数组,每个数组单元中存储一个字母(ASCII)码。关键在于找到空格的索引并替换为%20,最笨的就是一个一个遍历,判断是否为空格,如果是空格,则替换为%20(注意这个地方替换的是三个字符,所以新的被替换的字符串长度是源字符串长度的三倍)。这样的时间复杂度就是O(n)。
NOTE:这样题型是一种数组填充类的问题,先预先给数组扩容待添加元素之后的所有元素向后移动。一方面这样不需要重新申请数组,另一方面,不需要不断的移动数组,导致时间复杂度增高。
class Solution:
def replaceSpace(self, s: str) -> str:
counter = s.count(' ')
res = list(s)
# 每碰到一个空格就多拓展两个格子,1 + 2 = 3个位置存’%20‘
res.extend([' '] * counter * 2)
# 原始字符串的末尾,拓展后的末尾
left, right = len(s) - 1, len(res) - 1
while left >= 0:
if res[left] != ' ':
res[right] = res[left]
right -= 1
else:
# [right - 2, right), 左闭右开
res[right - 2: right + 1] = '%20'
right -= 3
left -= 1
return ''.join(res)
自己的代码
class Solution:
def replaceSpace(self, s: str) -> str:
# 记录字符串中的所有空格数目
spaceCnt=s.count(' ')
# 复制s到数列中
newS=list(s)
# 原来的1个空格位置再加两个空格
newS.extend([' '] * spaceCnt * 2)
# 指向原始字符串的最后一位
sLeft=len(s)-1
# 指向扩充后字符串的最后一位
nsLeft=len(newS)-1
while sLeft>=0:
if s[sLeft]==' ':
newS[nsLeft-2:nsLeft+1]='%20' #
sLeft-=1
nsLeft-=3
else:
newS[nsLeft]=s[sLeft]
sLeft-=1
nsLeft-=1
return ''.join(newS)