[剑指Offer]左旋转字符串

题目描述

汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!

解题思路

  • 方法一:直接调换位置;
  • 方法二:先对字符串的两段分别翻转,得到”cbafedZYX”再将原始的字符串翻转即得。

代码

Python(2.7.3)

方法一:Python作弊法

1
2
3
4
5
6
7
# -*- coding:utf-8 -*-
class Solution:
def LeftRotateString(self, s, n):
# write code here
if not s:
return ''
return s[n % len(s):] + s[:n % len(s)]

运行时间:29ms
占用内存:5732k

方法二:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# -*- coding:utf-8 -*-
class Solution:
def LeftRotateString(self, s, n):
# write code here
if not s:
return ''
def reverseStr(string, start, end):
s_list = list(string)
left, right = start, end
while left < right:
s_list[left], s_list[right] = s_list[right], s_list[left]
left += 1
right -= 1
return ''.join(s_list)
s = reverseStr(s, 0, n - 1)
s = reverseStr(s, n, len(s) - 1)
s = reverseStr(s, 0, len(s) - 1)
return s

运行时间:27ms
占用内存:5752k