題目:彙編語言中有一種移位指令叫作循環左移(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