翻转字符串

翻转字符串

翻转字符串单词顺序

【题目】
给定一个字符类型的数组chas,请在单词间做逆序调整。只要做到单词顺序逆序即可,对空格的位置没有特别要求。

【举例】
如果把chas看作字符串为"dog loves pig",调整成"pig loves dog"。
如果把chas看作字符串为"I’m a student.",调整成"student. a I’m"。

【要求】
如果chas长度为N,两道题都要求时间复杂度为 O ( N ) O(N) O(N),额外空间复杂度为 O ( 1 ) O(1) O(1)

算法思路

解题思路:先将字符串整体翻转,再将每个单词翻转
e.g. “dog loves pig” -> “gip sevol god” -> “pig lovel dog”
“I’m a student.” -> “.tneduts a m’I” -> “student. a I’m”

相应代码
# 翻转字符串单词顺序
def reverse_word(arr):
    if arr is None or len(arr) == 0:
        return arr
    reverse(arr, 0, len(arr) - 1)
    start = -1
    end = -1
    for i in range(len(arr)):
        # 遇见' ',将前面start至end的字符翻转
        if arr[i] == ' ':
            reverse(arr, start, end)
            start = -1
            end = -1
        else:
            if start == -1:
                start = i
                end = i
            else:
                end += 1
    # 翻转最后一个单词
    reverse(arr, start, end)

# 字符串整体翻转
def reverse(arr, start, end):
    while start < end:
        temp = arr[start]
        arr[start] = arr[end]
        arr[end] = temp
        start += 1
        end -= 1
        
# 简单测试
if __name__ == '__main__':
    s = "dog"
    chas = list(s)
    reverse_word(chas)
    print(''.join(chas))  # "dog"

    s = "dog loves pig"
    chas = list(s)
    reverse_word(chas)
    print(''.join(chas))  # "pig Loves dog"

    s = "I’m a student."
    chas = list(s)
    reverse_word(chas)
    print(''.join(chas))  # "student. a I'm"

字符串整体移动

【题目】
给定一个字符类型的数组chas和一个整数size,请把大小为size的左半区整体移到右半区,右半区整体移到左边。

【举例】
如果把chas看作字符串为"ABCDE",size=3,调整成"DEABC"。

【要求】
如果chas长度为N,两道题都要求时间复杂度为 O ( N ) O(N) O(N),额外空间复杂度为 O ( 1 ) O(1) O(1)

算法思路

解题思路:先将字符串整体翻转,再将右半区和左半区分别翻转
e.g. “ABCDE” -> “EDCBA” -> “DEABC”

相应代码
# 字符左右互移
def left_recur_size(arr, size):
    if arr is None or len(arr) == 0:
        return arr
    reverse(arr, 0, len(arr) - 1)  # 整体翻转
    reverse(arr, 0, len(arr) - size - 1)  # 左半区翻转
    reverse(arr, len(arr) - size, len(arr) - 1)  # 右半区翻转

# 字符串整体翻转
def reverse(arr, start, end):
    while start < end:
        temp = arr[start]
        arr[start] = arr[end]
        arr[end] = temp
        start += 1
        end -= 1

# 简单测试
if __name__ == '__main__':
    s = "ABCDE"
    chas = list(s)
    size = 3
    left_recur_size(chas, size)
    print(''.join(chas))  # "DEABC"

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值