怒刷力扣(最后一个单词的长度)

149 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情

最后一个单词的长度

WangScaler: 一个用心创作的作者。

声明:才疏学浅,如有错误,恳请指正。

题目

给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。

单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。

分析

既然是最后一个单词的长度,那么只需要从后往前遍历,当遇到空格或者遍历完毕时停止,遍历的长度就是我们最后一个单词的长度。

那么其次就要考虑考虑一些特殊情况了。

  • 第一种就是空字符串,这种好像对我们没有什么影响。
  • 第二种就是最后几个字符是空字符串。这个是很容易疏忽的一点。

起初我就是天真的以为最后一位不会出现空格。开始的代码这样写的

public static int lengthOfLastWord(String s) {
    int count = 0;
    for (int i = s.length() - 1; i >= 0; i--) {
        if (' ' == s.charAt(i)) {
            return count;
        }
        count++;
​
    }
    return s.trim().length();
}

image.png

提交之后,一直解答失败,一直纳闷a怎么计算出来的长度是2呢?后来才注意到a后边还有一个空格。啧啧,没对后边的空格进行处理。

答案

针对第二种情况的处理办法,我这里是加上一个标记位flag,标记最后的字符是否为空字符串,直到不是空字符串时flag为true,开始计算长度。

public static int lengthOfLastWord(String s) {
    boolean flag = false;
    int count = 0;
    for (int i = s.length() - 1; i >= 0; i--) {
        if (' ' == s.charAt(i)) {
            if (flag)
                return count;
            continue;
        }
        flag = true;
        count++;
​
    }
    return s.trim().length();
}

复杂度

  • 时间复杂度:O(n),最差的情况就是遍历整个字符串。
  • 空间复杂度:O(1),我们只需要几个变量记录我们的数据。

总结

因为我们需要最后一个字符的长度,所以进行反向遍历,自然是最简单最直接的思路,这个题没什么技术含量。最重要的就是处理后边几个空字符串的情况,我们这里采用的是标记法。而官方的示例是先倒叙遍历,如果是空字符串,则继续往下遍历。直到不是空字符串停止,接着就是我最初的思路,遇到空字符串或者遍历结束则计算长度。

都来了,点个赞再走呗!

关注WangScaler,祝你升职、加薪、不提桶!