434 - 字符串中的单词数(number-of-segments-in-a-string)

Create by jsliang on 2019-07-26 10:54:15
Recently revised in 2019-07-26 11:24:26

一 目录

不折腾的前端,和咸鱼有什么区别

目录
一 目录
二 前言
三 解题
3.1 解法 - 暴力破解 1
3.2 解法 - 暴力破解 2

二 前言

返回目录

统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。

请注意,你可以假定字符串里不包括任何不可打印的字符。

示例:

输入: "Hello, my name is John"
输出: 5

三 解题

返回目录

小伙伴可以先自己在本地尝试解题,再回来看看 jsliang 的解题思路。

3.1 解法 - 暴力破解

返回目录

  • 解题代码
var countSegments = function(s) {
  s = s.split(' ');
  let length = s.length;
  s.forEach((item) => {
    if (item === '') {
      length--;
    }
  })
  return length;
};
  • 执行测试

  • sHello, my name is John

  • return
5
  • LeetCode Submit
✔ Accepted
  ✔ 26/26 cases passed (116 ms)
  ✔ Your runtime beats 11.81 % of javascript submissions
  ✔ Your memory usage beats 11.76 % of javascript submissions (33.9 MB)
  • 知识点

  • split()split() 方法使用指定的分隔符字符串将一个 String 对象分割成字符串数组,以将字符串分隔为子字符串,以确定每个拆分的位置。split() 详细介绍

  • forEach()forEach() 方法对数组的每个元素执行一次提供的函数。forEach() 详细介绍

  • 解题思路

首先,明确题意:

  1. 'Hello, my name is John' 返回 5。
  2. ' ' 返回 0。

然后,原本打算直接:

var countSegments = function(s) {
  return s.split(' ').length;
};

结果不满足条件 2,报错了。

所以,修改为:

var countSegments = function(s) {
  s = s.split(' ');
  let length = s.length;
  s.forEach((item) => {
    if (item === '') {
      length--;
    }
  })
  return length;
};

即:我们先切割,再统计它的长度,遍历一次,如果发现里面存在 '' 空字符串,那么我们就将其长度减一。

最后,我们返回它的长度即可。

3.2 解法 - 暴力破解 2

返回目录

  • 解题代码
var countSegments = function (s) {
  let res = 0;
  s.split(' ').map((val) => {
    if (val !== '') {
      res++;
    }
  })
  return res;
}
  • 执行测试

  • sHello, my name is John

  • return
5
  • LeetCode Submit
✔ Accepted
  ✔ 26/26 cases passed (84 ms)
  ✔ Your runtime beats 48.03 % of javascript submissions
  ✔ Your memory usage beats 42.65 % of javascript submissions (33.7 MB)
  • 知识点

  • split()split() 方法使用指定的分隔符字符串将一个 String 对象分割成字符串数组,以将字符串分隔为子字符串,以确定每个拆分的位置。split() 详细介绍

  • map():遍历数组,item 返回遍历项,index 返回当前索引。map() 详细介绍

  • 解题思路

思路同 3.1,先将字符串切割成数组,然后遍历数组。

如果数组中的元素不是空格,那么就让元素 + 1,最终返回 res 即可。

  • 进一步思考

扩展题解 1:

var countSegments = function (s) {
  let transfer = [
      [0, 1],
      [0, 1]
    ],
    state = 0,
    count = 0;
  s += " ";
  for (let i = 0; i < s.length; ++i) {
    let id = (s[i] != " ") | 0,
      ns = transfer[state][id];
    if (state > ns) count++;
    state = ns;
  }
  return count;
};

Submit 提交记录:

✔ Accepted
  ✔ 26/26 cases passed (116 ms)
  ✔ Your runtime beats 11.81 % of javascript submissions
  ✔ Your memory usage beats 23.53 % of javascript submissions (33.8 MB)

扩展题解 2:

var countSegments = function (s) {
  //去除前后空白符,用\s+任何Unicode空白符分割的数组
  return (s.trim() === '') ? 0 : s.trim().split(/\s+/).length;
};

Submit 提交记录:

✔ Accepted
  ✔ 26/26 cases passed (88 ms)
  ✔ Your runtime beats 38.58 % of javascript submissions
  ✔ Your memory usage beats 35.29 % of javascript submissions (33.7 MB)

不折腾的前端,和咸鱼有什么区别!

图

jsliang 会每天更新一道 LeetCode 题解,从而帮助小伙伴们夯实原生 JS 基础,了解与学习算法与数据结构。

扫描上方二维码,关注 jsliang 的公众号,让我们一起折腾!

知识共享许可协议
jsliang 的文档库梁峻荣 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
基于https://github.com/LiangJunrong/document-library上的作品创作。
本许可协议授权之外的使用权限可以从 https://creativecommons.org/licenses/by-nc-sa/2.5/cn/ 处获得。

Copyright © jsliang.top 2019 all right reserved,powered by Gitbook该文件修订时间: 2019-07-26 11:24:27

results matching ""

    No results matching ""