[LeetCode][golang] 58. 最后一个单词的长度

148 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目描述:

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 <= 10的4次方
s 仅有英文字母和空格 ' ' 组成
s 中至少存在一个单词

思路分析:

方法1:

  1. 去掉末尾空格

  2. 空格分割成数组

  3. 取最后一个元素的长度

方法2:

  1. 定义一个逻辑变量,表示是否为字母。
    定义一个计数变量。

  2. 对于字符串从后向前循环。

    1. 如果 是否为字母变量 为 false ,且当前字符是空格,则进入下一次循环。
    2. 如果 是否为字母变量 为 false ,且当前字符不是空格,则 是否为字母变量 设置为 true 。
    3. 如果 是否为字母变量 为 true ,且当前字符是空格,则跳出循环。
    4. 如果 是否为字母变量 为 true ,且当前字符不是空格,则 计数变量 加 1 。
  3. 返回计数变量。

AC 代码:

方法1(golang):

// 最后一个单词的长度
func lengthOfLastWord(s string) int {
   tmp := strings.TrimSpace(s)
   slice := strings.Split(tmp, " ")
   ln := len(slice)
   return len(slice[ln-1])
}

方法2(golang):

// 最后一个单词的长度
func lengthOfLastWord(s string) int {
   isLetter := false
   c := 0
   for i := len(s) - 1; i >= 0; i-- {
      if !isLetter && s[i] == ' ' {
         continue
      }
      if !isLetter && s[i] != ' ' {
         isLetter = true
      }
      if isLetter && s[i] == ' ' {
         break
      }
      if isLetter && s[i] != ' ' {
         c = c + 1
      }
   }
   return c
}

总结:

第一个方法是最容易想到的,不过在 力扣 上提交了之后,发现速度和内存都没有优势。
然后开始想另外的方法,最后想到了第二个方法。
第二个方法用 go 语言很方便,其它语言倒是没试,只是觉着 go 可以直接对字符串循环,这个很给力。