听风是风

学或不学,知识都在那里,只增不减。

导航

JS leetcode 翻转字符串里的单词 题解分析

壹 ❀ 引

今天来做一道难度中等,但实际难度并不是很高的题目,题目来源leetcode151. 翻转字符串里的单词,题目描述如下:

给定一个字符串,逐个翻转字符串中的每个单词。

示例 1:

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

示例 2:

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

示例 3:

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

说明:

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

我先说说我的傻吊做法,再来分析优质的做法,那么本文开始。

贰 ❀ 不太聪明的做法

当我看到这题,我脑袋里第一想到的就是正则....对,用正则过滤掉字符首位空格,并将文字中多个空格转为一个,这样咱就可以利用split进行切割,reverse反转后,再利用join还原成字符串,说干就干(为此我还复习了一下正则...):

/**
 * @param {string} s
 * @return {string}
 */
var reverseWords = function(s) {
    return s.replace(/^\s+|\s+$/g, "").replace(/\s{2,}/g, " ").split(" ").reverse().join(" ");
};

傻吊在哪呢,我先用s.replace(/^\s+|\s+$/g, "")去除了首位空格,之后又用replace(/\s{2,}/g, " ")将可能存在的字符间多处空格转成一个,再按空格切分,反转,再次拼接。

我之所以跟空格这么过不去,还是因为题目描述中有多处强调空格的地方,所以才出此下策。

在查看别人思路的时候,我才想起来了有现成的trim()方法可用,所以可以这样:

/**
 * @param {string} s
 * @return {string}
 */
var reverseWords = function(s) {
    return s.trim().replace(/\s{2,}/g, " ").split(" ").reverse().join(" ");
};

显得我像个憨憨....

但事实上,我们根本不需要关注空格.....

以," hello world! "为例,将它按照" "进行切割,可以得到一个包含字符与多个空格的数组:

"  hello   world!  ".split(" ");//["", "", "hello", "", "", "world!", "", ""]

我们完全可以遍历一遍,去除掉数组中所有空格,这样就得到了如下数组:

["hello","world!"]

通过反转数组,再用join(" ")不就达到效果了。亏我纠结怎么加工空格想了半天,直接上代码:

/**
 * @param {string} s
 * @return {string}
 */
var reverseWords = function (s) {
    return s.split(" ").filter(item => item).reverse().join(" ");
};

那么关于本题就分析到这里了。

posted on 2020-06-02 21:39  听风是风  阅读(660)  评论(0编辑  收藏  举报