“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。
单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。
示例 1:
输入: s = "Hello World"
输出: 5
解释: 最后一个单词是“World”,长度为5。
示例2:
输入: s = " fly me to the moon "
输出: 4 解释: 最后一个单词是“moon”,长度为4。
二、思路分析:
这个题目并不难,只要找出最后一个单词即可。
这里我提供两种方法:
反向遍历
由于我们不确定字符串最后是否为空字符,因此我们首先需要找到最后一个字母,说明该字母即为最后一个单词的最后一个字母。
因此我们从最后一个字母开始反向遍历,当遍历到非空格字符或者字符串起始位置。在这个过程中,遍历到的每个元素都算是最后一个单词的范畴,因此我们边遍历边递增数量,遍历完毕后返回长度即可。
我们来模拟一下流程: "Hello World "
- 我们首先从字符串最末尾开始遍历,最后字符为空格,继续寻找
- 寻找到第一个最末尾字符 d ,开始计数
- 继续向前遍历,到 W 字符,此时字符串长度为 5
- 继续向前遍历,遍历到空格,遍历结束
- 输出长度 5
时间复杂度: O(n),n 为字符串的长度,算法需要反向遍历字符串,因此复杂度为O(n) 空间复杂度: O(1),只声明几个变量,声明了常数空间
字符串大法好
反向遍历看着很爽,其实距离真正的爽还是有大大的差距,我们可以直接借助 JavaScript 字符串提供的方法实现。
- trim 方法返回删除两头空格后的字符串
- split 以空格分割将字符串拆成多个单词
- at 复制直接遍历数组最后一个元素
- .length 属性,求出单词长度
var lengthOfLastWord = function(s) {
return s.trim().split(" ").at(-1).length
};
三、AC 代码:
// 反向遍历法
var lengthOfLastWord = function(s) {
let lastWordIndex = s.length - 1;
while (s[lastWordIndex] === ' ') lastWordIndex--;
let res = 0;
while (lastWordIndex >= 0 && s[lastWordIndex] !== ' ') {
res++;
lastWordIndex--;
}
return res;
};
四、总结:
双指针yyds,做好双指针,简单题直接 AC,舒服啊,今天又是一次过