一.需求
给你一个字符串 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 <= s.length <= 104
- s 仅有英文字母和空格 ’ ’ 组成
- s 中至少存在一个单词
二.思路图
第一步,从尾部开始循环,判断最后一个字符是否是英文,不是就向左侧移动1,直到遇到第一个英文字符
第二步,从倒数第二个开始,判断字符是否是英文,不是就继续向左侧移动1,直到遇到第一个英文字符
第三步,从倒数第三个开始,判断字符是否是英文,这里是遇到了“i”英文字符了,这样就启动start计数器= end的位置,记录最后一个的单词从“i”结尾的到开头的长度
第四步,从倒数第四个开始,还没有到下一个空格,就说明还是在单词的范围,将start-1继续看下一个数
第五步,从倒数第五个开始,已经是空格了,就说明单词的范围已经确认
第六步,将end的数-start 的数就能得出该单词的长度了
三.代码
测试
/**
* 入口
* 输入:s = " fly me to the moon "
* 输出:4
* 解释:最后的单词个数,空格为分割
*/
@Test
public void suanfa12()
{
// 58. 最后一个单词的长度
String s = " fly me to the moon ";
// 我自己的解法:用工具直接给他分了,然后获取最后的单词的个数既可
int i = lengthOfLastWordWzw(s);
System.out.println("i = " + i);
// 网络解法:用
int i1 = lengthOfLastWord(s);
System.out.println("j - i = " + i1);
}
方案1
/**
* 58. 最后一个单词的长度
* 网上解法:这样就可以减少内存的消耗
*
* @param s 字符串
* @return
*/
private int lengthOfLastWord(String s)
{
int j = s.length() - 1;
while (j >= 0 && s.charAt(j) == ' ')j--;
int i = j;
while (i >= 0 && s.charAt(i) != ' ')i--;
return j - i;
}
方案2
/**
* 58. 最后一个单词的长度
* 我的解法:这个我感觉最好理解
*
* @param s 字符串
* @return
*/
private int lengthOfLastWordWzw(String s)
{
String[] s1 = s.split(" ");
return s1[s1.length - 1].length();
}
作者:王子威
四.总结
- 学习了最后一个单词的长度算法
- 了解到工具类并非是内存运行效率最高的,有些恰恰相反
- 算法兴趣+1 总:12
- 加强了对算法的分析能力