力扣第五十八题-最后一个单词的长度

642 阅读3分钟

这是我参与8月更文挑战的第25天,活动详情查看:8月更文挑战

前言

力扣第五十八题 最后一个单词的长度 如下所示:

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

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

示例 1:

输入: s = "Hello World"
输出: 5

示例 2:

输入: s = "   fly me   to   the moon  "
输出: 4

示例 3:

输入: s = "luffy is still joyboy"
输出: 6

一、思路

最后一个单词的长度题目中有一个重要的信息:单词会用空格符 隔开

我们的目标是找到最后一个单词的长度,所有分两种方案来找到最后一个单词的长度。

双指针(从前往后)

从前往后遍历字符串, leftright 初始值都为 0。分为以下两种情况

  • 碰到空格符 :如果 right > left,则记录结果。再让双指针都指向当前位置,即 left = right = i
  • 碰到字母:此时让 right++ 即可

模拟计数(从后往前)

因为是找到最后一个单词的长度,此方案效率会更高。只要找了最后一个单词的长度,就会立即停止循环。

从后往前遍历字符串,count 初始值为 0。分为以下两种情况

  • 碰到字母:此时让 count++,计数加一即可
  • 碰到空格:如果此时 count > 0 直接跳出循环并返回 count 值即可

举个例子

此处选择方案二,并以示例3中的 s = "luffy is still joyboy" 作为例子

  1. i=20,此时 s.charAt(20) == 'y',计数 count = 1
  2. i=19,此时 s.charAt(19) == 'o',计数 count = 2
  3. i=18,此时 s.charAt(18) == 'b',计数 count = 3
  4. i=17,此时 s.charAt(17) == 'y',计数 count = 4
  5. i=16,此时 s.charAt(16) == 'o',计数 count = 5
  6. i=15,此时 s.charAt(15) == 'j',计数 count = 6
  7. i=14,此时 s.charAt(14) == ' ',此时跳出循环
  8. 返回计数值 6 即可

二、实现

实现代码

实现代码与思路中保持一致

双指针

    /**
     * 简单的双指针(从前往后)
     */
    public int lengthOfLastWord1(String s) {
        int len = s.length();
        int left = 0;
        int right = 0;
        int ret = 0;
        for (int i = 0; i < len; i++) {
            if (s.charAt(i) == ' ') {
                if (right > left)
                    ret = right - left;
                left = right = i;
            } else {
                right ++;
            }
        }
        return right > left ? right - left : ret; // 有可能最后一个单词没计数
    }

模拟计数

    /**
     * 简单的计数(从后往前)
     */
    public int lengthOfLastWord(String s) {
        int len = s.length();
        int count = 0;
        for (int i = len -1; i > -1; i--) {
            if (s.charAt(i) == ' ') {
                if (count > 0)
                    break;
            } else {
                count ++;
            }
        }
        return count;
    }

测试代码

    public static void main(String[] args) {
        String str = "luffy is still joyboy";
        new Number58().lengthOfLastWord(str);
    }

结果

此处的结果为模拟计数的结果,双指针的击败率只有百分之十几就没放上来了。

image.png

三、总结

不知不觉已经刷了一百题过半了qaq~

感谢看到最后,非常荣幸能够帮助到你~♥