Create by jsliang on 2019-07-26 10:54:152019-07-26 11:24:26
一 目录
不折腾的前端,和咸鱼有什么区别
| 目录 | | --- | | 一 目录 | | 二 前言 | | 三 解题 | | 3.1 解法 - 暴力破解 1 | | 3.2 解法 - 暴力破解 2 |
二 前言
难度:简单
涉及知识:字符串
题目地址:https://leetcode-cn.com/problems/number-of-segments-in-a-string/
题目内容:
统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。
请注意,你可以假定字符串里不包括任何不可打印的字符。
示例:
输入: "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;
};
执行测试:
s
:Hello,mynameisJohn
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()
详细介绍
解题思路:
首先,明确题意:
'Hello, my name is John'
返回 5。' '
返回 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;
}
执行测试:
s
:Hello,mynameisJohn
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 国际 许可协议进行许可。