牛客網在線編程專題《劍指offer-面試題42》左旋轉字符串

我的個人微信公衆號: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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章