这题不会!面壁思过,换行吧!

今天是小浩算法 365刷题计划” 第107天。满血,复活!

即日起,我们从这个题目开始,把 leetcode 前 200 道题,还没有讲过的,全部讲一遍。

暂定的目标是一周 3-5 篇题解。希望大家支持!一起进步!奥利给!

进刷题群的小伙伴

关注回复【进群】即可

01

PART

最后一个单词的长度

这是一道简单题,只需要普通的遍历就可以完成。不过会遇到一些坑,如果不注意,还是挺容易出错的。

最后一个单词的长度:给定一个仅包含大小写字母和空格 ' ' 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。

输入: "Hello World" 

输出: 5

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

02

PART

题解分析

因为我们要获取的是最后一个单词的长度,不难想到可以从尾开始遍历。

题中的陷阱在于,结尾处仍然可能有空格

所以一般的解题思路为,先去掉末尾的空格,然后从尾向前开始遍历,直到遇到第一个空格处结束。

但这里可以取一个巧,我们可以通过一个 count 来记数,从第一个不为空格的数开始记起。换句话说,如果末尾处为空格,此时 count 值为 0,可以直接略过。

//JAVA
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;
                break;
            }
            count++;
        }
        return count;        
    }
}

当然,并不是说我们不能直接用 API,来进行一些“机智”的解题,大不了就是被挂。

//JAVA
class Solution {
    public int lengthOfLastWord(String s) {
        s = s.trim();
        int start = s.lastIndexOf(" ") + 1;
        return s.substring(start).length();
    }
}

这个代码应该大家都能看懂,首先 trim 掉两边的空格,然后直接定位到最后一个单词的位置,将其截取下来获取长度。

额。既然我们 trim 都用了,那为什么我们不直接使用 split 得到最后一个单词的长度呢?

//JAVA
public class Solution {
    public int lengthOfLastWord(String s) {
        String[] words = s.split(" ");
        if (words.length < 1) return 0;
        return words[words.length - 1].length();
    }
}

03

PART

函数学习

上面的题解中用到了 trim,那 trim 除了去除两边的空格,是否还会去除其他字符呢?一起来看下 trim 的源码。

//JAVA
public String trim() {
  int len = value.length;
  int st = 0;
  char[] val = value;    /* avoid getfield opcode */

  while ((st < len) && (val[st] <= ' ')) {
      st++;
  }
  while ((st < len) && (val[len - 1] <= ' ')) {
      len--;
  }
  return ((st > 0) || (len < value.length)) ? substring(st, len) : this;
}

可以看到,Java 中的 trim 函数除了去除空格之外,还去除了所有在 ASCII 码表中排行小于等于空格的字符。

空格在 ASCII 码表中排行是 32位,可以看到 tab,换行,回车等都在 trim 的控制范围内。

如果你也想加入我们每日刷题

扫码,回复【进群】就可以啦。

也可以直接登录网站学习!

https://www.geekxh.com

推荐几篇必看文章:

漫画:小白为了面试如何刷题?(呕心沥血算法指导篇)

漫画:呕心泣血算法指导篇(真正的干货,怒怼那些说算法没用的人)

动态规划入门看这篇就够了,万字长文!

万字长文!位运算面试看这篇就够了!


奥利给!小手下面点个分享吧,试试微信的新功能哦~

展开阅读全文
©️2020 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值