Leetcode 刷题 - 186 - Reverse Words in a String II

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: ]) # 同理



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值