题目描述:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列 S=”abcXYZdef”,要求输出循环左移3位后的结果,即 “XYZdefabc”。是不是很简单?OK,搞定它!
Solutions
用暴力法,值得注意的是字符串是不能直接修改的,可以用 replace 来替换,但是不能直接利用下标的形式进行修改,一般是转成 list 进行操作后再拼接成字符串:
# -*- coding:utf-8 -*-
class Solution:
def LeftRotateString(self, s, n):
# write code here
if s is None or len(s) < 1:
return ''
size = len(s)
s_list = list(s)
for _ in range(n):
tmp = s_list[0]
for i in range(size-1):
s_list[i] = s_list[i+1]
s_list[-1] = tmp
return ''.join(s_list)
# 运行时间:25ms
# 占用内存:5852k
利用反转字符串的方式进行处理能达到较好的效果:
# -*- coding:utf-8 -*-
class Solution:
def RotateString(self, s):
if s is None or len(s) < 1:
return ''
begin = 0
end = len(s) - 1
while begin < end:
s[begin], s[end] = s[end], s[begin]
begin += 1
end -= 1
return s
def LeftRotateString(self, s, n):
# write code here
if s is None or len(s) < 1:
return ''
s = list(s)
size = len(s)
if n >= size:
n = n % size
n = size - n
s = self.RotateString(s)
s[:n] = self.RotateString(s[:n])
s[n:] = self.RotateString(s[n:])
return ''.join(s)
# 运行时间:35ms
# 占用内存:5852k