【思路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】原地反转
反转法一:
- 反转前半部分
- 反转后半部分
- 整体反转
反转法二:
- 整体反转
- 反转前半部分
- 反转后半部分
法一 法二的前后是不一样的
,拿具体数字试一下,形象一点
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
下面三个依次是三个思路的实现效果
思路一的方法竟然是最快的~