字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
思路1
没啥可说的
在对于大数据时join的效率要高于+
因为+操作是生成一个新的字符串,需要创建额外的内存,当数据量大时会很耗内存的
join对多个字符进行连接时效率高,只会有一次内存的申请。而且如果是对list的字符进行连接的时候,这种方法必须是首选
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
if s:
return ''.join([s[n:],s[:n]])
else:
return ""
思路2:三次旋转法
其实这个问题是<<翻转单词顺序>>的一个衍生
我们来看例子s = “abcdefg”, k = 2
步骤:
先将s看成两部分s[:2]和s[2:],然后分别翻转这两部分,此时s变为s = “bagfedc”
再将现在的s进行翻转,变成s = “cdefgab”,这就是结果
时间复杂度为O(n)
class Solution(object):
def reverseLeftWords(self, s, n):
"""
:type s: str
:type n: int
:rtype: str
"""
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)
return ''.join(s)