在Go语言练习中遇到这样一个问题
LeetCode:最后一个单词的长度
给你一个字符串 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”。
我首先想到的做法是用strings包中的字符分割函数 strings.Split(str," ")
但是由于Split匹配的分割关键字是" ",对于示例二中多个空格不能有效分割。
于是我了解到了专门用于分割空格的strings.Fields(str),Fields 用一个或多个连续的空格分隔字符串 s,返回子字符串的数组(slice)。如果字符串 s 只包含空格,则返回空列表([]string的长度为0)。
func lengthOfLastWord(s string) int {s_list := strings.Fields(s)length := len(s_list)return len(s_list[length-1])
}
除了使用内置包的方法外,我们可以从string末尾开始遍历,当遇到第一个不为空格的char时开始计数,到下一个空格的char时停止,相减即为最终结果。
func lengthOfLastWord(s string) int {var ans intfor i := len(s)-1; i >= 0; i-- {// 当前字符是空格,且之前包含非空格if s[i] == ' ' && ans > 0 {break}// 空格跳过// 非空格+1if s[i] != ' ' {ans++}}return ans
}
总结
1、Splits函数拥有划分指定匹配符号
2、Fields函数拥有划分空格
如果有更多想了解的字符串划分相关知识请看GO语言中字符串分割
如果有更多想了解strings包相关知识请看Go-String包