替换空格
题目要求输入一个字符串,然后用字符串"%20"替换原字符串中的空格,实际上就是用一个新的字符串new_string去替换原字符串中的某子字符串old_substring。
之前写的时候用了个变量char来装字符串,容易引起歧义但是也不想改了→_→
# Input a string name char...
import sys
char = input()
if char == '':
print("空字符串 or Null指针")
sys.exit()
replace魔法
直接用内置函数replace解决,只要能复现replace就不是事。
# offer04-solution 1
def Replace_space(char):
print(char.replace(' ','%20')) # 直接使用replace
return
Replace_space(char)
类似spilt的拼装
直接只用spilt会遭遇两个连续空格或多个连续空格的问题,因此写一个类似spilt的函数,新开O(n)的空间将旧字符串拼成新字符串。
# offer04-solution 2
def Replace_space(char):
pre = 0 # 判断前一个是不是空格
p = 0 # 指针位置
new_char = ''
for i in range(0,len(char),1):
if char[i]==' ':
if pre != 1:
new_char = new_char + (char[p:i])
pre = 1
new_char = new_char + ('%20')
p = i + 1
else:
pre = 0
if (i+1!=p):
new_char = new_char + (char[p:i+1])
print(new_char)
return
Replace_space(char)
类似原地从后向前替换
下面的写法虽然也新开了O(n)的空间,但是改一下就可以省下这O(n)的空间。在此基础上,使用从后往前遍历替换的方法,可以不用多次移动字符。
# offer04-solution 3
from collections import Counter
def Replace_space(char):
res = Counter(char)[' ']
new_length = len(char) + 2 * res
p_new = new_length - 1
p_old = len(char) - 1
new_char = [None for i in range(new_length)]
while p_old >= 0 & (p_new > p_old):
if char[p_old] == ' ':
new_char[p_new] = '0'
new_char[p_new-1] = '2'
new_char[p_new-2] = '%'
p_new -= 3
else:
new_char[p_new] = char[p_old]
p_new -= 1
p_old -= 1
print (''.join(new_char))
return
Replace_space(char)
小结
需要注意实际环境下对时间复杂度和空间复杂度的要求,如果是java的话还有别的方法。
参考:
Python 统计字符串里每个字符出现的次数的三种方法
Python split()方法