牛客网在线编程专题《剑指offer-面试题43》左旋转字符串

我的个人微信公众号:Microstrong

微信公众号ID:MicrostrongAI

微信公众号介绍:Microstrong(小强)同学主要研究机器学习、深度学习、计算机视觉、智能对话系统相关内容,分享在学习过程中的读书笔记!期待您的关注,欢迎一起学习交流进步!

知乎主页:https://www.zhihu.com/people/MicrostrongAI/activities

Github:https://github.com/Microstrong0305

个人博客:https://blog.csdn.net/program_developer

 题目链接:

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

题目描述:

解题思路:

(1)利用Python的字符串切片

# -*- coding:utf-8 -*-
class Solution:
    def LeftRotateString(self, s, n):
        # write code here
        return s[n:] + s[:n]

(2)找到字符串旋转时每个字符移动的规律

       要找到字符串旋转时每个字符移动的规律,不是一件轻松的事情。那我们是不是可以从解决《翻转单词顺序列》问题的思路中找到启发?在这个问题中,如果输入的字符串之中只有两个单词,比如”hello world”,那么翻转这个句子中的单词顺序就得到了”world hello”。比较这两个字符串,我们是不是可以把”world hello”看成把原始字符串 ”hello world”的前面若干个字符转移到后面?也就是说这两个问题是非常相似的,我们同样可以通过翻转字符串的办法来解决本问题。

        以“abcdefg”为例,我们可以把它分为两部分。由于想把它的前两个字符移到后面,我们就把前两个字符分到第一部分,把后面的所有字符分到第二部分。我们先分别翻转这两部分,于是就得到”bagfedc”。接下来翻转整个字符串,得到的”cdefgab”刚好就是把原始字符串左旋转两位的结果。

        通过前面的分析,我们发现只需要调用3次Reverse函数就可以实现字符串的左旋转功能。已经AC的代码如下:

# -*- coding:utf-8 -*-
class Solution:
    def LeftRotateString(self, s, n):
        # write code here
        if len(s) == 0:
            return s
        s = list(s)

        def Reverse(s, start, end):
            for i in range(start, (start + end) // 2 + 1):
                s[i], s[end - i + start] = s[end - i + start], s[i]
            return s

        n %= len(s)
        # 翻转字符串的前面n个字符
        s = Reverse(s, 0, n - 1)
        # 翻转字符串的后面部分
        s = Reverse(s, n, len(s) - 1)
        # 翻转整个字符串
        s = Reverse(s, 0, len(s) - 1)

        return "".join(s)

Reference:

【1】《剑指offer》,何海涛著。

【2】https://github.com/shenweichen/coding_interviews/blob/master/58.%E5%B7%A6%E6%97%8B%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2/58.%E5%B7%A6%E6%97%8B%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2.py

发布了294 篇原创文章 · 获赞 1046 · 访问量 124万+

猜你喜欢

转载自blog.csdn.net/program_developer/article/details/104935946