替换与调整字符串

文章目录

    • 替换与调整字符串
      • 替换字符串
        • 算法思路
        • 相应代码
      • 调整字符串
        • 算法思路
        • 相应代码
      • 小结

替换与调整字符串

替换字符串

【题目】
给定一个字符类型的数组chas[],chas右半区全是空字符,左半区不含有空字符。
现在想将左半区中所有的空格字符替换成"%20",假设chas右半区足够大,可以满足替换所需要的空间,请完成替换函数。

【举例】
如果把chas的左半区看作字符串,为"a b c",假设chas的右半区足够大。
替换后, chas的左半区为"a%20b%20%20c"。

【要求】
替换函数的时间复杂度为 O ( N ) O(N) O(N),额外空间复杂度为 O ( 1 ) O(1) O(1)

算法思路

统计左半区的总字符数量left_len,空格数量space_num
替换后的长度为left_len + 2 * space_num
从右往左,复制字符
  若为空格字符(’ ‘),则依次复制’0’,‘2’,’%'字符;
  否则复制相应的字符。

相应代码

# 替换字符串
def replace(chas):
    if chas is None or len(chas) == 0:
        return chas
    space_num = 0
    left_len = 0
    for i in range(len(chas)):
        if chas[i] != 0:
            if chas[i] == ' ':
                space_num += 1
            left_len += 1
        else:
            break
    size = left_len + 2 * space_num
    j = size - 1
    for i in range(left_len - 1, -1, -1):
        if chas[i] != ' ':
            chas[j] = chas[i]
            j -= 1
        else:
            # chas[j - 2: j + 1] = "%20", j -= 3
            chas[j] = '0'
            j -= 1
            chas[j] = '2'
            j -= 1
            chas[j] = '%'
            j -= 1

# 简单测试
if __name__ == '__main__':
    print("替换字符串")
    chas = ['a', ' ', 'b', ' ', 'c', 0, 0, 0, 0]
    replace(chas)
    print(chas)

调整字符串

【补充题目】
给定一个字符类型的数组chas[],其中只含有数字字符和’*‘字符。
现在想把所有的’*'字符挪到chas的左边,数字字符挪到chas的右边。请完成调整函数。

【举例】
如果把chas看作字符串,为"12**345"。调整后chas为"**12345"。

【要求】

  1. 调整函数的时间复杂度为 O ( N ) O(N) O(N),额外空间复杂度为 O ( 1 ) O(1) O(1)
  2. 数字字符仍按从左到右的顺序出现。

算法思路

从右往左,复制字符
  遇见数字字符,复制;
  遇见’*‘字符,跳过;
  最终统一填充’*'字符。

相应代码

# 调整字符串
def modify(chas):
    size = len(chas)
    j = size - 1
    for i in range(size - 1, -1, -1):
        if chas[i] != '*':
            chas[j] = chas[i]
            j -= 1
    while j > -1:
        chas[j] = '*'
        j -= 1
        
# 简单测试
if __name__ == '__main__':
    print("调整字符串")
    s = "12**345"
    chas = list(s)
    modify(chas)
    print(chas)
    print("字符串形式", ''.join(chas))
    print()

    s = "1*2**34*5"
    chas = list(s)
    modify(chas)
    print(chas)
    print("字符串形式", ''.join(chas))
    print()

小结

两题都采用从右往左,复制字符
其实很多字符串问题也和这个小技巧有关。
字符串的面试题一般不会太难,很多题目都是在考查代码实现能力

有任何疑问和建议,欢迎在评论区留言和指正!

感谢您所花费的时间与精力!

你可能感兴趣的:(程序员代码面试指南)