剑指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)

举一反三:
在合并两个数据(包括字符)时,如果从前往后复制每个数字(或字符)则需要重复移动数字(或字符)多次,那么我们可以考虑从后往前复制,这样就能减少移动的次数,从而提高效率。

posted @ 2022-03-15 11:31  酷酷的排球  阅读(53)  评论(0编辑  收藏  举报