(python版)《剑指Offer》JZ43:左旋转字符串

牛客
Leetcode
在这里插入图片描述

【思路1】切片

class Solution1:
    def reverseLeftWords(self, s, n):
        return s[n:] + s[:n]
  • 时间复杂度 O(N) : 其中 N 为字符串 s 的长度,字符串切片函数为线性时间复杂度
  • 空间复杂度 O(N): 两个字符串切片的总长度为 N 。

【思路2】列表遍历拼接

class Solution:
    def reverseLeftWords(self, s, n):
        res = []
        for i in range(n,len(s)):
            res.append(s[i])
        for i in range(n):
            res.append(s[i])
        return ''.join(res)
'''
作者:jyd
链接:https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/solution/mian-shi-ti-58-ii-zuo-xuan-zhuan-zi-fu-chuan-qie-p/
来源:力扣(LeetCode)
'''
  • 时间复杂度 O(N) : 线性遍历 s 并添加,使用线性时间;
  • 空间复杂度 O(N): 新建的辅助 res 使用 O(N) 大小的额外空间。

【思路3】原地反转

反转法一:

  1. 反转前半部分
  2. 反转后半部分
  3. 整体反转

反转法二:

  1. 整体反转
  2. 反转前半部分
  3. 反转后半部分

法一 法二的前后是不一样的,拿具体数字试一下,形象一点

class Solution:
    def reverseLeftWords(self, s, n):
        if n > len(s) or not s:
            return ''
        s = list(s)
        def reverse(start, end):
            while start < end:
                s[start], s[end] = s[end], s[start]
                start += 1
                end -= 1
        length = len(s) - 1
        # 法一
        # reverse(0, n-1)
        # reverse(n,length)
        # reverse(0, length)
        
        # 法二
        reverse(0, length)
        reverse(0, length-n)
        reverse(length-n+1, length)
        return ''.join(s)
s=[abcdefg] k=2

反转法一:
s[:2]=ab        前反转: ba
s[3:]=cdefg     后反转: gfedc
s[:]=ba gfedc   整体反转: cdefg ba

反转法二:
s[:]=abcdefg    整体反转: gfedcba
s[:7-1-2]=gfedc 前反转: cdefg
s[7-2:7-1]=ba   后反转: ab

下面三个依次是三个思路的实现效果
思路一的方法竟然是最快的~
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值