剑指offer 翻转单词顺序列

翻转单词顺序列

题目

类似于左旋转字符串

牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?

方法

第一步:翻转句子中所有字符,此时不仅翻转了句子中的单词顺序,还翻转了单词内的字符顺序。由’I am a student.’得到’.tneduts a ma I’
第二部:再翻转每个单词中的字符顺序。由’.tneduts a ma I’得到’student. a am I’

在英语句子中,每个单词被空格符号分隔,因此可以通过扫描空格来确定每个单词的起始和种植位置。start指向每个单词的第一个字符,end指向单词的最后一个字符。

方法1

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
31
32
33
34
35
36
37
38
# -*- coding:utf-8 -*-
class Solution:
def ReverseSentence(self, s):
# write code here
if not s or len(s)<=0:
return ''
strlist=list(s) # 必须将s转换为list,然后再reverse
strlist=self.Reverse(strlist) # TypeError: 'str' object does not support item assignment
start,end =0,0
result=''
listTemp=[]

while end<len(s):
if end==len(s)-1:
listTemp.append(self.Reverse(strlist[start:]))
break

if strlist[start]==' ': # 注意if从哪里开始,不然会影响到后面的else
start+=1
end+=1
listTemp.append(' ')
elif strlist[end]==' ':
listTemp.append(self.Reverse(strlist[start:end]))
start=end
else:
end+=1
for i in listTemp:
result+=''.join(i)
return result
def Reverse(self, s):
if not s or len(s)<=0:
return ''
start, end=0, len(s)-1
while start<end:
s[start], s[end]=s[end], s[start]
start+=1
end-=1
return s

方法2

1
2
3
4
5
6
# -*- coding:utf-8 -*-
class Solution:
def ReverseSentence(self, s):
# write code here
strlist=s.split(' ')
return ' '.join(strlist[::-1])