这是我参与8月更文挑战的第25天,活动详情查看:8月更文挑战
前言
力扣第五十八题 最后一个单词的长度 如下所示:
给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。
单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。
示例 1:
输入: s = "Hello World"
输出: 5
示例 2:
输入: s = " fly me to the moon "
输出: 4
示例 3:
输入: s = "luffy is still joyboy"
输出: 6
一、思路
最后一个单词的长度题目中有一个重要的信息:单词会用空格符 隔开
我们的目标是找到最后一个单词的长度,所有分两种方案来找到最后一个单词的长度。
双指针(从前往后)
从前往后遍历字符串, left 和 right 初始值都为 0。分为以下两种情况
- 碰到空格符
:如果right > left,则记录结果。再让双指针都指向当前位置,即left = right = i - 碰到字母:此时让
right++即可
模拟计数(从后往前)
因为是找到最后一个单词的长度,此方案效率会更高。只要找了最后一个单词的长度,就会立即停止循环。
从后往前遍历字符串,count 初始值为 0。分为以下两种情况
- 碰到字母:此时让
count++,计数加一即可 - 碰到空格:如果此时
count > 0直接跳出循环并返回count值即可
举个例子
此处选择方案二,并以示例3中的 s = "luffy is still joyboy" 作为例子
i=20,此时s.charAt(20) == 'y',计数count = 1i=19,此时s.charAt(19) == 'o',计数count = 2i=18,此时s.charAt(18) == 'b',计数count = 3i=17,此时s.charAt(17) == 'y',计数count = 4i=16,此时s.charAt(16) == 'o',计数count = 5i=15,此时s.charAt(15) == 'j',计数count = 6i=14,此时s.charAt(14) == ' ',此时跳出循环- 返回计数值
6即可
二、实现
实现代码
实现代码与思路中保持一致
双指针
/**
* 简单的双指针(从前往后)
*/
public int lengthOfLastWord1(String s) {
int len = s.length();
int left = 0;
int right = 0;
int ret = 0;
for (int i = 0; i < len; i++) {
if (s.charAt(i) == ' ') {
if (right > left)
ret = right - left;
left = right = i;
} else {
right ++;
}
}
return right > left ? right - left : ret; // 有可能最后一个单词没计数
}
模拟计数
/**
* 简单的计数(从后往前)
*/
public int lengthOfLastWord(String s) {
int len = s.length();
int count = 0;
for (int i = len -1; i > -1; i--) {
if (s.charAt(i) == ' ') {
if (count > 0)
break;
} else {
count ++;
}
}
return count;
}
测试代码
public static void main(String[] args) {
String str = "luffy is still joyboy";
new Number58().lengthOfLastWord(str);
}
结果
此处的结果为模拟计数的结果,双指针的击败率只有百分之十几就没放上来了。
三、总结
不知不觉已经刷了一百题过半了qaq~
感谢看到最后,非常荣幸能够帮助到你~♥