题目
给你一个字符串 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作为上下文信息来追踪进度,也是一个比较有意思的方法。
总结
题目虽然简单,但是想写的更加优雅还是有很多的方法的。