「这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战」
题目
给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。
单词:是指仅由字母组成、不包含任何空格字符的最大子字符串。
示例 1:
输入:s = "Hello World"
输出:5
示例 2:
输入:s = " fly me to the moon "
输出:4
示例 3:
输入:s = "luffy is still joyboy"
输出:6
提示:
-
1 <= s.length <= 104
-
s 仅有英文字母和空格 ' ' 组成
-
s 中至少存在一个单词
解题思路
看到题目第一眼,啊,真的好简单。刚刚被动态规划虐的好惨,终于碰到一题简单的可以放松一下啦😌~
方法一:转数组
先通过trim()方法去除字符串前后的空格。
然后用split方法将字符串根据空格拆分为数组。
最后返回数组中最后一位数的长度即可。
/**
* @param {string} s
* @return {number}
*/
var lengthOfLastWord = function(s) {
let arr = s.trim().split(' ');
return arr[arr.length - 1].length;
};
转数组的这种方法我看题解后发现有两个更高校更好玩的解法,分享如下:
下面两种解法除了运用split拆分字符串得到数组,还通过数组的pop方法直接获取到最后一个元素并求其长度即可。
第二种则是通过reverse反转数组直接拿取第一个元素求长度即可。
/**
* @param {string} s
* @return {number}
*/
var lengthOfLastWord = function(s) {
return s.trim().split(' ').pop().length;
};
/**
* @param {string} s
* @return {number}
*/
var lengthOfLastWord = function(s) {
return s.trim().split(' ').reverse()[0].length;
};
方法二:反向遍历字符串
- 直接反向遍历
- 通过判断当前值是否为' ' , 如果是,则先跳过空字符
- 从第一个不是空的字符开始计数
- 若再遇到空字符,停止
- 注意边界条件
/**
* @param {string} s
* @return {number}
*/
const lengthOfLastWord = s => {
let [res, i] = [0, s.length - 1];
// 跳过空字符
while (s[i] === ' ') i--;
// 统计单词长度
// 防止`ASD`的情况,无限循环,加一个边界条件:i >= 0
while (i >= 0 && s[i] !== ' ') {
i--;
res++;
}
return res;
};
结束语
这里是小葵🌻,只要把心朝着太阳的地方,就会有温暖~
让我们一起来攻克算法难关吧!!