题目描述:汇编语言中有一种移位指令叫做循环左移(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

References

  1. 042a. 左旋转字符串