开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第18天,点击查看活动详情
力扣58. 最后一个单词的长度
一、题目描述:
给你一个字符串 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 中至少存在一个单词
来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
-
这道题考察了什么思想?你的思路是什么?
我的思路很简单,遍历字符串,当出现不为空的字符时开始记录,一直到出现空格停止记录,然后放入切片中。如此直到字符串遍历完毕,然后再取切片中最后一个字符串即可。
比如:"luffy is still joyboy"
开始遍历字符串,记录
l直到出现第一个空格停止,此时已经记录了luffy,放入切片中,然后开始下一个is、still、joyboy。然后取切片最后一个joyboy即可。func lengthOfLastWord(s string) int { arr := make([]string,0) str := make([]string,0) for _,s := range s{ if s != ' '{ str = append(str,string(s)) } fmt.Println(str) if s == ' '{ str = make([]string,0) } str1 := strings.Join(str,"") fmt.Println(str1) arr = append(arr,str1) } r := 0 fmt.Println(arr) for i:=len(arr)-1;i>=0;i--{ if len(arr[i]) > 0{ r = len(arr[i]) break } } return r }
-
哈哈哈哈,执行用时超过0.00%的用户。
-
做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?
其实,我们只需要反向遍历字符串,寻找最后一个单词然后计算其长度即可。
因为字符串至少存在一个单词,因此反向遍历的第一个字母即单词的最后一个字母,我们只需要计算长度即可,到后面的第一个空格停止计数即可。
-
有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?
用s.trim()去掉字符串的前后空格,从第一个单词开始计数,若中间遇到空格,计数器重置为0。
class Solution { public int lengthOfLastWord(String s) { String s1 = s.trim(); char[] ch=s1.toCharArray(); int t=0; for (int i = 0; i < ch.length; i++) { if (ch[i]!=' '){ t++; }else { t=0; } } return t; } } 作者:chao-bo-jie 链接:https://leetcode.cn/problems/length-of-last-word/solution/yong-strimqu-diao-zi-fu-chuan-de-qian-ho-vp4e/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
三、AC 代码:
func lengthOfLastWord(s string) (ans int) {
index := len(s) - 1
for s[index] == ' ' {
index--
}
for index >= 0 && s[index] != ' ' {
ans++
index--
}
return
}
四、总结:
反向遍历即可,我把它搞复杂了,结果导致时间复杂度太高了!
模板来源:
作者:掘金酱
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。