【刷题第12天】58. 最后一个单词的长度

108 阅读2分钟

“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,舒服啊,今天又是一次过