• leetcode题解58


    leetcode题解

    58. 最后一个单词的长度

    难度 简单

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

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

    示例 1:

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

    示例 2:

    输入:s = " "
    输出:0
    

    提示:

    • 1 <= s.length <= 104
    • s 仅有英文字母和空格 ' ' 组成

    解法一:字符串遍历

    思路

    从字符串末尾开始向前遍历,其中主要有两种情况
    第一种情况,以字符串"Hello World"为例,从后向前遍历直到遍历到头或者遇到空格为止,即为最后一个单词"World"的长度5
    第二种情况,以字符串"Hello World "为例,需要先将末尾的空格过滤掉,再进行第一种情况的操作,即认为最后一个单词为"World",长度为5
    所以完整过程为先从后过滤掉空格找到单词尾部,再从尾部向前遍历,找到单词头部,最后两者相减,即为单词的长度
    时间复杂度:O(n),n为结尾空格和结尾单词总体长度

    class Solution {
        public int lengthOfLastWord(String s) {
            int end = s.length()-1;
            while(end>=0&&s.charAt(end)==' '){
                end--;
            }
            if(end<0){
                return 0;
            }
            int start = end;
            while(start>=0&&s.charAt(start)!=' '){
                start--;
            }
            return end-start;
        }
    }
    

    注意条件

    end>=0&&s.charAt(end)==' '

    start>=0&&s.charAt(start)!=' '

    解法二:双指针

    整体思路非常简单,就是从后往前遍历。定义两个指针i和j,同时从末尾往前出发。当找到最后一个单词的最后一个字母的时候,也就是反向遍历碰到的一个英文字符,此时,j停止移动,固定于此。然后i继续往前移动,直到遇到空格,此时停止。然后,j - i就是最后一个单词的长度。

    这里需要注意,虽然i指向的是空格,j的长度减去i的长度,正好得到单词的长度。

    时间复杂度:O(n),n为字符串长度
    空间复杂度:O(1)

    class Solution {
        public int lengthOfLastWord(String s) {
           if(s==null||s.length()==0){
               return 0;
           }
           int i=s.length()-1;
           int j=s.length()-1;
           while(i>=0&&j>=0){
               if(i==j&&s.charAt(i)==' '){
                   i--;
                   j--;
               }else if(i<j&&s.charAt(i)==' '){
                   break;
               }else {
                   i--;
               }
           }
           return j-i;
        }
    }
    

    解法三:无标记计数器

    思路:从尾向头遍历

    1.如果遇到空格,continue下一次循环

    2.如果第一次是空格,第二次不是空格,则break;然后计数

    3.如果没有遇到空格,直接计数

    class Solution {
        public int lengthOfLastWord(String s) {
            if (s == null || s.length() == 0) {
                return 0;
            }
            int count = 0;//计数器
            for (int i = s.length() - 1; i >= 0; i--) {
                if (s.charAt(i) == ' ') {
                    //进一步判断
                    if (count == 0) {
                        continue;
                    } else {
                        break;
                    }
                } else {//不是空格就计数
                    count++;
                }
    
            }
            return count;
        }
    }
    
    

    解法四:标记计数器

    从后向前遍历 如果结尾处是" ",那么就跳过这次继续遍历下一个字符 直到不是" "时进行计数 如果遇到第一个" "后进行计数,遇到第二个" "时则终止计数直接返回结果即可 遍历时使用flag标记第一次以及第二次遇到" "

    class Solution {
        public int lengthOfLastWord(String s) {
            if (s.length() == 0) {
                return 0;
            }
            int res = 0;
            boolean flag = true;
            for (int i = s.length() - 1; i >= 0; i--) {
                if (s.charAt(i) == ' ' && flag) {
                    continue;
                }
                if (s.charAt(i) != ' ') {
                    res++;
                    flag = false;
                }
                if (s.charAt(i) == ' ' && !flag) {
                    break;
                }
            }
            return res;
        }
    }
    
    

  • 相关阅读:
    SQLServer2005删除log文件和清空日志的方案
    使用sql语句创建修改SQL Server标识列(即自动增长列)
    C# 使用ffmpeg.exe进行音频转换完整demo-asp.net转换代码
    web页面如何播放amr的音频文件
    IIS7.5 伪静态 脚本映射 配置方法
    多表数据连接 Left join
    .NET 开发快捷键大全
    微信开发-ACCESS TOKEN 过期失效解决方案
    HTML5常用的方法
    IIS 7.0 部署MVC
  • 原文地址:https://www.cnblogs.com/wanwanyuan/p/14391489.html
Copyright © 2020-2023  润新知