描述
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列 S,请你把其循环左移 K 位后的序列输出(保证 K 小于等于 S 的长度)。例如,字符序列S=”abcXYZdef”,要求输出循环左移 3 位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
官方题解:
①遍历
将字符串 s 分为两个部分,分别对两部分循环遍历,形成左旋转字符串
1、判断特殊情况:字符串 s 为空字符,n > len(s),直接返回空字符
2、创建返回字符 res,循环遍历字符串 s 的【n,len(s)-1】,依次添加到res中
3、第二次循环遍历字符串 s 的【0,n-1】,依次添加到 res 中
4、返回res
class Solution:
def LeftRotateString(self, s, n):
# write code here
res = ''
if s == None:
return res
if n > len(s):
return res
for i in range(n, len(s)):
res += s[i]
for j in range(n):
res += s[j]
return res
时间复杂度O(N):两次循环遍历整个字符串,N表示字符串的长度
空间复杂度O(N):返回数组占用空间,整个字符串长度
②字符串字串
由于 s + s 包含了所有可以通过旋转操作从 s 得到的字符串
1、使用额外字符串 tmp = s + s
2、直接获取 tmp字符串的 【n:n+len(s)】
字符串 str = 'abcXYZdef' n=3
tmp = s + s : 'abcXYZdefabcXYZdef'
tmp[n:n+len(s)] = 'XYZdefabc'
class Solution:
def LeftRotateString(self, s, n):
# write code here
tmp = s + s
return tmp[n:n+len(s)]
Python讨论组的题解太简洁啦,估计面试不太实用,但是很厉害:
# -*- coding:utf-8 -*-
class Solution:
def LeftRotateString(self, s, n):
# write code here
return s[n:]+s[:n]