我的个人微信公众号:Microstrong
微信公众号ID:MicrostrongAI
微信公众号介绍:Microstrong(小强)同学主要研究机器学习、深度学习、计算机视觉、智能对话系统相关内容,分享在学习过程中的读书笔记!期待您的关注,欢迎一起学习交流进步!
知乎主页:https://www.zhihu.com/people/MicrostrongAI/activities
题目链接:
题目描述:
解题思路:
(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》,何海涛著。