替换与调整字符串

替换与调整字符串

替换字符串

【题目】
给定一个字符类型的数组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()

小结

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

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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值