meishaoming / blog

MIT License
1 stars 2 forks source link

leetcode - 0151 翻转字符串里的单词 #77

Open meishaoming opened 4 years ago

meishaoming commented 4 years ago

https://leetcode-cn.com/problems/reverse-words-in-a-string/

今天的「每日一题」

我的思路:

找到每个单词的起始下标,存到列表里。最后表列表返过来,逐个取出字符串拼起来。

解法一

用 python 的话,就先 split 切出每个单词,然后 reverse 整个列表。

class Solution:
    def reverseWords(self, s: str) -> str:
        l = s.split()
        l.reverse()
        return ' '.join(l)

为什么不能写成一句话 ' '.join(s.split().reverse())

因为 l.reverse() 方法是原地反转,它并不返回反转后的对象。所以 s.split().reverse() 这句话实际执行了反转,但没有返回值(没有返回值的时候就是默认返回值 None)。 ' '.join() 函数拿到的参数是 None。

看了一下答案,同样的方法,另两种写法更老练:

2

class Solution:
    def reverseWords(self, s: str) -> str:
        return ' '.join(s.split()[::-1])

3

class Solution:
    def reverseWords(self, s: str) -> str:
        return ' '.join(reversed(s.split()))
image

python 的反转方法对比

有三种常用反转方法

  1. list.reverse()
  2. [::-1]
  3. reversed()

list.reverse() 是 List 对象原地反转,注意它并不返回对象,它实上它没有返回值(所以返回值是默认的 None)。str 没有 reverse() 方法。

[::-1] 这个操作叫作「切片」(slicing),会返回一个新的对象。str 和 list 都可以用(可迭代对象都可以用)。

reversed() 是一个内置函数,它的返回值是一个迭代器 iterator。引用一下标准库文档里的解释:

reversed(seq) 返回一个反向的 iterator。 seq 必须是一个具有 reversed() 方法的对象或者是支持该序列协议 (具有从 0 开始的整数类型参数的 len() 方法和 getitem() 方法)。