剑指offer--字符串
字符换的替换
一般方法:
思路:从前向后,直接找到需要被替换的字符,进行替换
缺点:
需要移动被替换的字符其后字符,造成时间复杂度为O(n^2);
优化:
思路:从后向前,进行遍历和替换;
首先遍历,找出有多少个被替换的字符,然后计算出,替换字符后所需容器大小,使用双指针从后向前进行遍历,遇到被替换的字符时,进行替换,此时,时间复杂度为O(n)。
def replace_blank(string:str):
original_length = len(string)
if original_length == 0:
return ''
number_of_blank = 0
for s in string:
if s == ' ':
number_of_blank += 1
# new_length将空格替换成,‘%20’后的长度
new_length = original_length + number_of_blank * 2
index_of_original = original_length
index_of_new = new_length
new_string = [''] * index_of_new
while index_of_original >= 0 and index_of_new >= index_of_original:
if string[index_of_original] == ' ':
new_string[index_of_new] = '0'
index_of_new -=1
new_string[index_of_new] = '2'
index_of_new -= 1
new_string[index_of_new] = '%'
index_of_new -= 1
else:
new_string[index_of_new] = string[index_of_original]
index_of_new -= 1
index_of_original -= 1
return "".join(new_string)
举一反三:
在合并两个数据(包括字符)时,如果从前往后复制每个数字(或字符)则需要重复移动数字(或字符)多次,那么我们可以考虑从后往前复制,这样就能减少移动的次数,从而提高效率。