leetcode 第58题 最后一个单词的长度

题目

给你一个字符串 s,由若干单词组成,单词之间用单个或多个连续的空格字符隔开。返回字符串中最后一个单词的长度。如果不存在最后一个单词,请返回 0 。

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

示例1

输入:s = “Hello World”
输出:5

示例2

输入:s = " "
输出:0

思路

这个题其实很简单,就是从后往前遍历字符串的每个字符就可以。但是相同的思路落实到代码上还是会有比较大的差异。下面写一下几个版本代码的差异

代码

第一版代码

class Solution {
    public int lengthOfLastWord(String s) {
        int result = 0;
        boolean start = false;
        for (int i = s.length()-1; i >=0;i--) {
            char c = s.charAt(i);
            if (c==' ') {
                if (start) {
                    break;
                }
            } else {
                start = true;
                result++;
            }
        }
        return result;
    }
}

这个代码的思路就是从后往前遍历,一开始如果有空格,不做累加,继续往前遍历,只有开始计算之后再遇到空格才会跳出。
这里其实start这个标识是多余的,可以直接判断result这个数字是否已经大于0,就能够知道是否已经开始统计数字了。

第二版代码

class Solution {
    public int lengthOfLastWord(String s) {
        int result = 0;
        for (int i = s.length()-1; i >=0;i--) {
            char c = s.charAt(i);
            if (c!=' ') result++;
            if (c==' ' && result > 0) break;
        }
        return result;
    }
}

这个代码看起来就简洁了很多。

另外一种写法

其实上面的代码都是在一次遍历中完成逻辑,在遍历过程中用break进行流程区分。
还有一种方法是把流程弄成直的,先遍历最后的空格,然后去遍历最后一个单词。代码如下

class Solution {
    public int lengthOfLastWord(String s) {
        int result = 0;
        int index = s.length()-1;
        while (index >=0 && s.charAt(index)==' ') index--;
        while (index >=0 && s.charAt(index--)!=' ') result++;
        return result;
    }
}

这个代码从逻辑上是一条直线,用一个index作为上下文信息来追踪进度,也是一个比较有意思的方法。

总结

题目虽然简单,但是想写的更加优雅还是有很多的方法的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值