剑指 Offer 05. 替换空格
题目大意
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = "We are happy."
输出:"We%20are%20happy."
解题思路
在网络编程中,如果 URL参数中含有特殊字符,如空格、 γ等,可能 导致服务器端无法获得正确的参数值。我们 需要将这些特殊符号转换成服 务器可以识别的字符。转换的规则是在'%'后面跟上 ASCII 码的两位十六进 制的表示。比如空格的ASCII码是 32. 即十六进制的 0x20. 因此空格被替 换成"%20"。再比如γ的ASCII码为35. 即十六进制的0x23. 它在URL中 被替换为 "%23"。
时间复杂度分析
时间复杂度为\(O(n^2)\)的解法, 不足以拿到Offer
假设字符串的长度是 n。对每个空格字符,需要移动后面 O(n)个字符, 因此对含有 0(0)个空格字符的字符串而言总的时间效率是 0(n2)。
当我们把这种思路阐述给面试官后 ,他不会就此满意,他将让我们寻找更快的方法。
能不能减少移动次数呢?答案是肯定的。我们换一种思路 , 把从前向后替换改成从后向前替换。(python的字符串对象不可修改, 可以通过列表的append方法从前往后追加)
时间复杂度为\(O(n)\)的解法
-
针对C++等语言, 支持原地操作. 先遍历一遍, 确定空格的数量, 计算出
newLength(originalLength+2*numOfBlack), 子符串后面有足够的内存地址的前提下, 建立两个指针, 分别指向新数组和原数组的末尾, 原数组指针每次向前移动一位, 然后复制一个字符到新数组指针指向的位置, 新数组指针也移动一位. 遇到空格后, 新数组指针复制%20, 向前移动三位. (while终止条件: 原数组指针指向起点且新数组指针追上原数组指针) -
Python不支持原地操作, 可以新建列表从前往后遍历追加
方法1: 列表追加
class Solution(object):
def replaceSpace(self, s):
"""
:type s: str
:rtype: str
"""
res = []
for ch in s:
if ch == ' ':
res.append('%20')
else:
res.append(ch)
return "".join(res)
方法2: 使用Python的内置子符串处理工具
return "%20".join(s.split(" "))
时间开销, 空间开销中等
s.replace(" ", "%20")
相对于方法1, 时间开销小, 空间开销大

浙公网安备 33010602011771号