算法試題 - 翻轉字符串

題目

題目:彙編語言中有一種移位指令叫作循環左移(ROL),如今有個簡單的任務,就是用字符串模擬這個指令的運算結果。
對於一個給定的字符序列S,請你把其循環左移K位後的序列輸出。例如,字符序列S=」abcXYZdef」,要求輸出循環左移3位後
的結果,即「XYZdefabc」。是否是很簡單?OK,搞定它函數

解析

思路一

切片 + 拼接spa

思路二

對原字符串進行擴充兩倍,在這個基礎上直接從要反轉的地方取就能夠,至關於前n個字符串翻轉了,思想很是好code

思路三

首先須要寫一個reverse函數,把任何輸入的字符串徹底翻轉。而後根據題目中給出的左旋轉字符串的個數n,
用全字符串長度length減去旋轉字符串個數n,求得對於新的字符串應該在哪一位進行旋轉,而後分別旋轉前[:length-n]子
串和[length-n:]子串,從新拼接兩個子串便可。
舉例: n=2
1 2 3 4 5
5 4 3 2 1 總體反轉
3 4 5 1 2 對於5-2=3部分翻轉,對於最後2 1再部分翻轉blog

答案

'''
思路一:

29ms
5760k
'''

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

'''
思路二:對原字符串進行擴充兩倍,在這個基礎上直接從要反轉的地方取就能夠,至關於前n個字符串翻轉了,思想很是好

28ms
5760k
'''

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

'''
儘可能避免使用內置函數
思路三:首先須要寫一個reverse函數,把任何輸入的字符串徹底翻轉。而後根據題目中給出的左旋轉字符串的個數n,
用全字符串長度length減去旋轉字符串個數n,求得對於新的字符串應該在哪一位進行旋轉,而後分別旋轉前[:length-n]子
串和[length-n:]子串,從新拼接兩個子串便可。
舉例:  n=2
       1 2 3 4 5
       5 4 3 2 1   總體反轉
       3 4 5 1 2   對於5-2=3部分翻轉,對於最後2 1再部分翻轉

28ms
5760k
'''

# -*- coding:utf-8 -*-
class Solution:
    def LeftRotateString(self, s, n):
        # write code here
        if not s or len(s) < n or n < 0:
            return ''
        s = list(s)
        length = len(s)
        s = self.Reverse(s)
        s1 = self.Reverse(s[:length - n])
        s2 = self.Reverse(s[length - n:])
        result = ''.join(s1) + ''.join(s2)
        return result

    def Reverse(self, s):
        start = 0
        end = len(s) - 1
        while start < end:
            s[start], s[end] = s[end], s[start]
            start += 1
            end -= 1
        return s

 

自我實現答案

s = "shdkfhkxm"


def func(s, k):
    return s[k:] + s[:k]


print(func(s, 3))  # kfhkxmshd
相關文章
相關標籤/搜索