gbin
V2EX  ›  算法

20180323 今日算法

  •  
  •   gbin · Mar 23, 2018 via Android · 5651 views
    This topic created in 3156 days ago, the information mentioned may be changed or developed.
    Given an input string, reverse the string word by word.

    For example,
    Given s = "the sky is blue",
    return "blue is sky the".

    PS: 今天题目不算难,一种方法是用栈,是 O(n)的复杂度,看看各位有什么巧妙的方法吧。
    27 replies  •  2018-03-23 22:30:40 +08:00
    lhx2008
    lhx2008
    Mar 23, 2018 via Android
    1
    split 之后,递归到尾部,返回的时候拼接
    gbin
    gbin
    OP
    Mar 23, 2018 via Android
    2
    @lhx2008 思路不错。
    cloverii
    cloverii
    Mar 23, 2018 via Android
    3
    我某次三面的时候被问过这题,所以这是个考栈的题么…我直接像 1L 那样说了 因为面试官说让我用 Python 写…
    lhx2008
    lhx2008
    Mar 23, 2018 via Android❤️1
    4
    split 之后,头尾之间交换也可以,扫 1.5 次,空间复杂度更优
    gbin
    gbin
    OP
    Mar 23, 2018 via Android
    5
    @cloverii 我倒觉得用递归比用栈好吧,二者空间复杂度都是 O(n),递归时间复杂度 O(n),栈 O(2n)。我看到给的提示说有更厉害的方法只需 O(1),只是没去查过,看看有没有大神提出来吧。
    66450146
    66450146
    Mar 23, 2018 via iPhone❤️6
    6
    整个字符串反转,再扫一遍每个词反转即可,空间 O1
    zc666
    zc666
    Mar 23, 2018 via iPad
    7
    python 的话可以直接 split 之后数组下标从-1 开始然后下标每次递减 1,当出现 list index out of range 错误之后即是倒序遍历完了
    iEverX
    iEverX
    Mar 23, 2018 via Android
    8
    通常还会加上原地的限制,用 split,面试官一般不会满意的。当然 python 就没办法了
    gbin
    gbin
    OP
    Mar 23, 2018 via Android
    9
    @iEverX 所以我认为#6 楼最有道理。
    thebigban
    thebigban
    Mar 23, 2018 via Android
    10
    @gbin 六楼这个有问题,如果反转,单词也被反转了。
    hx1997
    hx1997
    Mar 23, 2018 via Android
    11
    分割之后倒着拼接,或者栈,只会这俩
    gbin
    gbin
    OP
    Mar 23, 2018 via Android
    12
    @thebigban 没有吧,先整个字符串反转再单词反转呢。
    zoffy
    zoffy
    Mar 23, 2018❤️1
    13
    js:

    "the sky is blue".split(' ').reverse().join(' ')
    thebigban
    thebigban
    Mar 23, 2018 via Android
    14
    @gbin 看错了。。。
    tongz
    tongz
    Mar 23, 2018
    15
    php:
    $str = "the sky is blue";

    echo implode(' ', array_reverse(explode(' ', $str)));
    cloverii
    cloverii
    Mar 23, 2018 via Android
    16
    @gbin 发现我把一楼看错了…并不知道怎么递归…重翻了一下面经,发现面试官这题问得很随意,于是我也很随意的说 split 一下再倒着输出,他没有进一步问了…(我一直觉得是因为我说用 py 写过点小爬虫,所以他问了我一个 sb 问题看我到底会不会写 py,现在突然觉得好像不是那么回事了…可能这就是我过了面试但是钱并不多的原因吧[手动狗头]
    zqqian
    zqqian
    Mar 23, 2018 via Android
    17
    lz 可以出点不这么简单的题么。。。。。
    domty
    domty
    Mar 23, 2018
    18
    变形的翻转字符串。
    muziki
    muziki
    Mar 23, 2018
    19
    fn main() {
    let s = "the sky is blue";
    let rev_s = s.split_whitespace().rev().collect::<Vec<&str>>().join(" ");

    println!("{:?}", rev_s);
    }
    gbin
    gbin
    OP
    Mar 23, 2018 via Android
    20
    @zqqian 出难一点的讨论的不多呀,你看昨天前天
    gbin
    gbin
    OP
    Mar 23, 2018 via Android
    21
    @gbin 可能你比较厉害😂😂觉得简单
    snw
    snw
    Mar 23, 2018 via Android
    22
    可以把题目改成字符串大于内存,但每个词小于内存😂
    xgzxy
    xgzxy
    Mar 23, 2018
    23
    @snw 你这个想法不错
    pagict
    pagict
    Mar 23, 2018
    24
    ```python
    ' '.join(line.split()[::-1])
    ```
    rammiah
    rammiah
    Mar 23, 2018
    25
    #24 估计是最简单的了
    WilliamLin
    WilliamLin
    Mar 23, 2018 via Android
    26
    Python 的话就用 split 加 reverse 加 join
    mrcn
    mrcn
    Mar 23, 2018 via Android
    27
    @snw 有正解吗?感觉不能做到倒着输入 /输出。。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4973 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 57ms · UTC 02:14 · PVG 10:14 · LAX 18:14 · JFK 21:14
    ♥ Do have faith in what you're doing.