力扣58-最后一个单词的长度

给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。

示例 1:

输入:s = "Hello World"
输出:5
解释:最后一个单词是“World”,长度为5。

示例 2:

输入:s = "   fly me   to   the moon  "
输出:4
解释:最后一个单词是“moon”,长度为4。

示例 3:

输入:s = "luffy is still joyboy"
输出:6
解释:最后一个单词是长度为6的“joyboy”。

解法1:从后往前遍历

思路:

我们要完成的任务是在两个位置做标记,第一个是最后一个单词的开头(记为pos1,初始化为0),第二个是在最后一个单词的结尾(记为pos2,初始化为0)。

我们可以选择从后往前遍历字符串,然后判断每个字符是否是非空格,遇到的第一个非空格字符,那么就是我们要寻找的第二个标记(pos2=i),继续往前遍历,去找我们的第一个标记,第一个标记有两种情况:

第一种是最后一个单词前边存在空格的时候,那么就是当遍历到的字符等于空格的时候,便是第一个标记的位置,例如"helle world"

第二种情况是整个句子只有一个单词,那么此时他也是最后一个单词,他的前边已经不存在空格,而是到达了数组的边界了,那么我们需要在字符串的边界做上标记。如“hello”

另一个比较重要的点是怎么实现保证先找第二个标记,再找第一个标记呢,我们可以用两个标记flag1、flag2来实现,分别代表第一个标记和第二个标记,如果flag2=true,表示当下正在寻找第二个标记,当寻找到第二个标记时,执行flag2=false;和flag1=true;表示当下正在寻找第一个标记。这样结合&&操作就可以实现顺序执行。

代码

class Solution {
    public int lengthOfLastWord(String s) {
        //把多个空格的地方全部换成一个空格
        boolean flag1=true;
        boolean flag2=false;
        int pos1=0;
        int pos2=0;

        //从后往前遍历,直到遇到第一个非空格
        for(int i=s.length()-1;i>=0;i--){
            //确定结尾
            if(!(s.charAt(i)==' ')&&flag1){
                pos2=i;
                flag1=false;
                flag2=true;
            }
            //确定开头
            if(s.charAt(i)==' '&&flag2){
                pos1=i;
                break;
            }

            //要考虑边界的情况
            if(i==0&&flag2){
                pos1=i-1;
                break;
            }
        }
        return pos2-pos1;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值