Skip to content

151. 翻转字符串里的单词(js) #2

@crawler-django

Description

@crawler-django

题目描述: 给定一个字符串,逐个翻转字符串中的每个单词。(原题地址: https://leetcode-cn.com/problems/reverse-words-in-a-string/)
示例 1

输入: "the sky is blue"
输出: "blue is sky the"

示例 2

输入: "  hello world!  "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

示例 3

输入: "a good   example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

说明

  • 无空格字符构成一个单词。
  • 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
  • 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

进阶

请选用 C 语言的用户尝试使用 O(1) 额外空间复杂度的原地解法。


(先不说C语言的实现)

思考: 看到这题我的第一想法就是用正则, 然后倒序合并就行了. 或者不太会正则, 简单的数组操作也行. 但是复杂度不能达到O(1)。先写处理问题的答案吧, 从简单到困难.

  1. (非正则的数组操作) 首先先从字符串到数组的转换, 然后倒序根据空格来获取单词, 再合并. 最后考虑到i=0后 str还有值的情况, 需要再push str.
    代码如下:
var reverseWords = function(s) {
    let arr = s.split('')

    let goalArr = []

    let str = ''
    for(let i = arr.length - 1; i >= 0; i -= 1) {
        if (arr[i] === ' ') {
            if (str) {
                goalArr.push(str)
                str = ''
            }
        } else {
            str = arr[i] + str
        }
    }

    if (str) {
        goalArr.push(str)
    }

    return goalArr.join(' ')
};

运行结果:
image

运行结果效率一般, 但是空间问题很大.

  1. (正则实现) 其实正则实现, 写代码是最简单的. 难得不过是记不住正则的规则和写法. 用上正则几行代码就能搞定.
var reverseWords = function(s) {

    if (s.trim()) {
        let arr = s.match(/\S+/g)

        arr.reverse()

        return arr.join(' ')
    }

    return s.trim()

};

就这么几行代码, 就能实现. 是不是很easy, 让我们看看运行结果.
运行结果:
image

空间问题倒是可以了, 但是运行效率比方法1低.


这些都比较依赖于语言的api了, 感兴趣的可以用C手写试试.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions