《剑指offer》python实现系列,全目录
题目一:
翻转单词顺序
输输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串”Iama student.”,则输出” ‘student.aamI”。
第一想法:1
2
3
4
5class Solution:
def ReverseSentence(self, s):
s = s.split(' ')
sreversed = " ".join(s[::-1])
return sreversed
剑指offer方法:
第一步翻转句子中所有的字符。比如翻转” I am a student.”中所有的字符得到” .tneduts a ma I”,此时不但翻转了句子中单词的顺序,连单词内的字符顺序也被翻转了。
第二步再翻转每个单词中字符的顺序,就得到了” ‘student. a am I”。这正是符合题目要求的输出。
在英语句子中,单词被空格符号分隔,可以通过扫描空格来确定每个单词的起始和终止位置。指针Begin指向单词的第一个字符,而指针pEnd指向单词的最后一个字符。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31class Solution:
def ReverseSentence(self, s):
if not s or len(s) <= 1:
return s
pBegin,pEnd = 0,len(s)-1
s = list(s)
self.Reverse(s,pBegin,pEnd) #反转整个句子
pBegin,pEnd = 0,0
while pEnd
if s[pBegin] == ' ':
pBegin += 1
pEnd += 1
elif s[pEnd] == ' ':#end指向单词结尾,翻转单词
pEnd -= 1 #不翻转空格
self.Reverse(s,pBegin,pEnd)
pEnd += 1 #再重定位到空格
pBegin = pEnd
elif pEnd == len(s) -1:
#最后一个没有空格,也要进行翻转
self.Reverse(s,pBegin,pEnd)
break
else:#在单词中的情况
pEnd += 1
return ''.join(s)
def Reverse(self,s,pBegin,pEnd):
while pBegin < pEnd:
s[pBegin],s[pEnd] = s[pEnd],s[pBegin]
pBegin += 1
pEnd -= 1
题目二:
左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。
比如,输入字符串” abcdefg”和数字2,该函数将返回左旋转两位得到的结果” cdefgab’
第一想法:1
2
3class Solution:
def LeftRotateString(self, s, n):
return s[n:]+s[:n]
剑指offer方法:
可以从解决第一个问题的思路中找到启发,3次Reverse操作
在第一个问题中,如果输入的字符串之中只有两个单词,比如” hello world”,那么翻转这个句子中的单词顺序就得到了” world hello”。比较这两个字符串,我们是不是可以把” world hello”看成把原始字符串” hello world”的前面若干个字符转移到后面?也就是说这两个问题是非常相似的,我们同样可以通过翻转字符串的办法来解决第二个问题。
以” abcdefg”为例,我们可以把它分为两部分ab 和 cdefg。由于想把它的前两个字符移到后面,我们就把前两个字符分到第一部分,把后面的所有字符分到第二部分。我们先分别翻转这两部分,于是就得到” bagfedc”。接下来翻转整个字符串,得到的” cdefgab”刚好就是把原始字符串左旋转两位的结果。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24class Solution:
def LeftRotateString(self, s, n):
if not s or n>len(s) or n<0:
return ''
if n==0 or n == len(s):
return s
if len(s)>0 and 0
#先分成两部分,分别翻转
start1,end1 = 0, n-1
start2,end2 = n,len(s)-1
s = list(s)
self.reverse(s,start1,end1)
self.reverse(s,start2,end2)
#再翻转整个句子
self.reverse(s,start1,end2)
return ''.join(s)
def reverse(self, data, start, end):
while start < end:
data[start], data[end] = data[end], data[start]
start += 1
end -= 1
Solution().LeftRotateString("abcdefg",7)