Given an input string, reverse the string word by word. A word is defined as a sequence of non-space characters.
The input string does not contain leading or trailing spaces and the words are always separated by a single space.
For example,
Given s = "the sky is blue
",
return "blue is sky the
".
Could you do it in-place without allocating extra space?
Related problem: Rotate Array
问题很清楚,就是给出一个字串,让你reverse,然后整体reverse的同时,内部的根据单个空格隔开的字串不reverse。
步骤基本就是
1. 整体reverse。这里reverse了包括内部的字串。
2. 对内部字串再次reverse。得到的结果就基本是我们需要的。
3. test case没过,因为最后的一个字串扫不到,需要另行reverse。
class Solution(object):
def reverseWords(self, s):
"""
:type s: a list of 1 length strings (List[str])
:rtype: nothing
"""
s.reverse() # 用了python的reverse方法,略微快一点
index = 0
for i in range(len(s)):
if s[i] == " ":
self.reverse_list(s, index, i - 1) # 因为index i是空格,所以只需要对[index : i-1]进行reverse
index = i + 1
self.reverse_list(s, index, len(s) - 1) # 上面提到的第三点,对最后一个loop扫不到的字串reverse
def reverse_list(self, s, start, end):
while start < end:
temp = s[start]
s[start], s[end] = s[end], temp
start += 1
end -= 1
Tip: Python 的reverse方法,不能reverse slice of list。
ll = ["h", "i", "!", " ", "a", "b"]
ll.reverse() # ['b', 'a', ' ', '!', 'i', 'h']
ll[0:2].reverse() # ['b', 'a', ' ', '!', 'i', 'h']
由上,可以看到,list的一部分进行reverse()方法,并没有效果。slice python的list,进行reverse操作,并不影响原来的list。
但是,我们可以对slice of list进行赋值。
class Solution(object):
def reverseWords(self, s):
"""
:type s: a list of 1 length strings (List[str])
:rtype: nothing
"""
s.reverse() # 整体调用reverse()
index = 0
for i in range(len(s)):
if s[i] == " ":
s[index: i] = reversed(s[index: i]) # slice使用reversed,先reverse,再赋值。 Tip, s[index:i](i not include),python list 不包含最后一个index i。 需要和上面自己写的方法区别。
index = i + 1
s[index: ] = reversed(s[index: ]) # 同理