题目描述
给定一个仅包含字母(不限大小写)和空格' '
的字符串s
,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。
如果不存在最后一个单词,请返回0
。
说明: 一个单词是指仅由字母组成、不包含任何空格字符的最大子字符串。
示例:
输入: s = “Hello World”
输出: 5
思路分析
难度是简单 , 这道题需要注意的有几点:
- 全为空字符
‘ ’
; - 字符末尾存在若干空字符
' '
; - 如何确定某个单词的长度?
- 若字符串中仅存在一个单词时,是否存在边界异常?
对于问题1,2 ,我们简单一些通过String.trim()
直接将字符串前后的空格均去掉即可(当然,也可以自己编码进行末尾空字符去除),去除的好处就是使得核心代码功能更单一,纯粹;
对于问题3,假设给定字符串为Hello World
,我们已知最后一个单词的下标为s.length() - 1
,这时只求解字符W
的前一空字符下标即可,当满足s.charAt(i) == ' '
时,即为所求,此时可知最后一个单词的长度为s.length() - i - 1
;
对于问题4,我们必须考虑这个边界条件,因为其不存在s.charAt(i) == ' '
的情况,故我们在返回值做一点判断即可:retrun i == -1 ? s.length() : res
。
我们直接给出解题代码:
解题代码
代码1: 基本实现
public static int solution(String s) {
if (s == null || s == "") {
return 0;
}
s = s.trim();
int len = s.length();
int i;
int res = 0;
for(i = len - 1; i >= 0; i--){
if(s.charAt(i) == ' '){
res = len - i - 1;
break;
}
}
return i == -1 ? len : res;
}
代码2: 代码优化
public static int solution(String s) {
if (s == null || s == "") {
return 0;
}
s = s.trim();
int len = s.length();
int i = len - 1;
while(i >= 0 && s.charAt(i) != ' '){
i--;
}
return i < 0 ? len : len - i - 1;
}
这道题目其实可以考虑的角度有很多,小伙伴们不妨多发散思考一下,也可以在文章下留言分享~~
复杂度分析
这里我们设S
为字符串总长度;l
为最后一个单词长度;
时间复杂度: 这里我们倒序访问字符,则时间复杂度为O(l + 1)
;
空间复杂度: 没有辅助容器,故空间复杂度为O(1)
;
Github源码
完整可运行文件请访问GitHub。