剑指Offer 43. 左旋转字符串 (字符串)

Posted on 2018-10-16 12:41  _hqc  阅读(84)  评论(0编辑  收藏  举报

题目描述

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

题目地址

https://www.nowcoder.com/practice/12d959b108cb42b1ab72cef4d36af5ec?tpId=13&tqId=11196&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

思路

思路1:利用字符串切片

思路2:多次翻转,先将0~n-1翻转,n~len(s)-1翻转,最后将整个字符串翻转

Python

# -*- coding:utf-8 -*-
class Solution:
    def LeftRotateString(self, s, n):
        # write code here
        if len(s) <= 1:
            return s
        n = n % len(s) # 处理n>len(s)的情况
        # 思路1
        # return s[k:] + s[:k]
        # 思路2
        # return (s[:n][::-1]+s[n:][::-1])[::-1]
        # 思路2
        s = list(s)
        self.reverse(s,0,n-1)
        self.reverse(s,n,len(s)-1)
        self.reverse(s,0,len(s)-1)
        return "".join(s)
    def reverse(self, s,start,end):
        while start < end:
            s[start],s[end] = s[end],s[start]
            start += 1
            end -= 1

if __name__ == '__main__':
    result = Solution().LeftRotateString('abcXYZdef',4)
    print(result)