题目描述
难度:简单
给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。
单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。
示例 1:
输入:s = "Hello World"
输出:5
示例 2:
输入:s = " fly me to the moon "
输出:4
示例 3:
输入:s = "luffy is still joyboy"
输出:6
提示:
1 <= s.length <= 104
s 仅有英文字母和空格 ' ' 组成
s 中至少存在一个单词
分析
读题,求最后一个单词的长度,那么我们可以从字符串末尾从头遍历;
定义遍历 res ,遇到非空格的字符 则 res++ , 遇到空格字符代表最后一个单词已经遍历完成,返回 res 就好;
再分析示例就会发现,存在结尾为空格的字符串,这就不符合我们上面所说的遍历条件,为了满足遍历条件,我们可以使用 String 的 trim 方法去除头尾的空格,然后再进行遍历,这样就能满足要求了。
代码:
public int lengthOfLastWord(String s) {
int res = 0;
if(s.charAt(s.length() - 1) == ' '){ // 最后一个字符为空格
s = s.trim();
}
for (int i = s.length() - 1; i >= 0; i--) {
if(s.charAt(i) != ' '){
res++;
}else {
break;
}
}
return res;
}
由于 String 的效率一直不高,所以我怕用 trim 方法会影响程序效率(其实影响不大),就用了另一种不使用 trim 的方法;
我么可以给定一个布尔类型的标记 flag = false,当我们从后往前遍历字符串,只要遇到空格字符时,都不会让 res++,因为此时 flag 为 false,不满足res++ 的条件;当遇到第一个非空格字符时, res++ 且 flag 为设置为 true(flag为true代表进入了最后一个单词的遍历) ,此时只要遇到非空格字符则 res++,直到再次遇到空格字符,就可结束循环,最后一个单词遍历结束;
代码:
public int lengthOfLastWord(String s) { // 这种方式内存占用更少
int res = 0;
boolean flag = false;
for (int i = s.length() - 1; i >= 0; i--) {
if(flag){ // flag 为true时,代表进入了第一个单词的遍历
if(s.charAt(i) != ' '){
res++;
}else {
break;
}
} else if(s.charAt(i) != ' '){// 遇到第一个非空格字符时, flag 为 true 且 res++
flag = true;
res++;
}
}
return res;
}
总结
中秋节的题,来自leetcode的暖心简单题,祝大家中秋快乐!再接再厉!
岁月悠悠,衰微只及肌肤;热忱抛却,颓废必致灵魂