题目描述:
- 实现一个函数,把字符串中的每一个空格替换为“%20”。
- 例如,输入“we are happy.” ,则输入“we%20are%20happy.”
题目分析:
对题目的分析:
- 题目初始分析,首先想到将初始的一个空格字符,替换之后变成‘%’、‘2’、‘0’ 3个字符,故字符串整体是变长的
- 如果在原始字符串上替换的话,就有可能修改字符串后面的字符内存
- 如果是创建一个新的字符串,我们就可以申请足够的内存来进行替换
- 若是面试官要求我们在初始字符串上去修改的话,我们有一下的思路
一些想法:
- 最直观的做法就是,从头到尾扫描一遍,每次碰到一个空格,就去替换,
- 但由于是将一个字符替换为3个字符,所以空格后面的字符串要全部后移2位。
- 即就是有几个空格,我们就要将其后面的字符后移几次。
- 假设字符串的长度是n,对每一个空格字符串,需要移动后面的 O(n) 个字符,若是含有 O(n) 个空格,则 时间复杂度是 O(n^2)
- 显然这样不是最好的做法。
详细思路:
- 我们先遍历整个字符串,统计字符串中的空格的个数,由此可以计算最后新的字符串的长度。
- 每次替换一个空格,长度增加2,所以 新字符串的长度等于初始长度加上2乘以空格个数。
- 我们从字符串的后面开始赋值和替换。指定两个指针i和j,i指向初始字符串的末尾,j指向新的字符串的末尾。
- 依次将i指针指向的元素复制给j指针对应的元素,直至指针i遇到空格
- 把指针i左移,指针j对应的元素替换为“%20”’,再把指针j左移3位。
- 如此重复直至遍历所有的字符串。
代码实现:
class Solution:
def replaceblank(self,char):
if char == None or len(char) <= 0: # 排序无效字符串和空字符串
return False
count = 0 # 计数变量
for i in range(len(char)): # 遍历,统计空格个数
if char[i] == ' ':
count += 1
char_new = char + ' '*2*count # 新的字符串
i = len(char)-1 # 初始字符串的尾指针
j = len(char_new) -1 # 新字符串的尾指针
char_new = list(char_new) # 由于字符串不能执行赋值操作,转为list
while i >= 0:
if char_new[i] != ' ': # 指针 i 未指向空格时,将 i 的值赋值给 j
char_new[j] = char_new[i]
i -= 1
j -= 1
else: # 指针 i 指向空格时: i-1 ,给 [j-2:j+1]赋值‘%20’,并左移三位
i -= 1
char_new[j-2:j+1] = '%20'
j -= 3
return ''.join(char_new) # 再转化为字符串
if __name__ == '__main__':
# 验证:
# 输入字符串包含空格(空格在最右边;在最左边;在中间;有连续多个)
test_1 = 'wearehappy '
test_2 = ' wearehappy'
test_3 = 'we are happy'
test_4 = 'we are happy'
# 输入字符串中没有一个空格
test_5 = 'wearehappy'
# 特殊输入测试(无效的字符串;空字符串;字符串只有一个空格;字符串中有连续空格)
test_6 = None
test_7 = ''
test_8 = ' '
test_9 = ' '
solution = Solution()
print("test_1:", solution.replaceblank(test_1))
print("test_2:", solution.replaceblank(test_2))
print("test_3:", solution.replaceblank(test_3))
print("test_4:", solution.replaceblank(test_4))
print("test_5:", solution.replaceblank(test_5))
print("test_6:", solution.replaceblank(test_6))
print("test_7:", solution.replaceblank(test_7))
print("test_8:", solution.replaceblank(test_8))
print("test_9:", solution.replaceblank(test_9))
验证结果:
test_1: wearehappy%20
test_2: %20wearehappy
test_3: we%20are%20happy
test_4: we%20%20%20%20are%20happy
test_5: wearehappy
test_6: False
test_7: False
test_8: %20
test_9: %20%20%20%20
复杂度分析:
时间复杂度:
上述代码空格替换为%20可以忽略不计,主要的花费在遍历字符串中。,因此时间复杂度是 O(n),
空间复杂度:O(1)