问题描述
对于给定的若干个单词组成的句子,每个单词均由大小写字母混合构成,单词间使用单个空格分隔。输出最后一个单词的长度。
输入描述:
在一行上输入若干个字符串,每个字符串代表一个单词,组成给定的句子。
除此之外,保证每个单词非空,由大小写字母混合构成,且总字符长度不超过
1
0
3
10
3
。
输出描述:
在一行上输出一个整数,代表最后一个单词的长度。
示例1
输入:
HelloNowcoder
复制
输出:
13
复制
说明:
在这个样例中,最后一个单词是
"HelloNowcoder"
"HelloNowcoder" ,长度为
13
13 。
示例2
输入:
A B C D
复制
输出:
1
一、题目理解
输入
一行字符串,由字母和空格组成。
输出
最后一个单词的长度。
单词定义:
由连续的字母组成,中间用空格分隔。
二、示例分析
示例 1
输入
HelloNowcoder
分析
整个字符串没有空格
说明只有 一个单词
最后一个单词:HelloNowcoder
长度:13
输出
13
示例 2
输入
A B C D
分析
单词依次是:A、B、C、D
最后一个单词:D
长度:1
输出
1
三、核心解题思路(非常重要)
这类题有 两种常见解法:
解法一:从后往前遍历(推荐)
思路
从字符串 末尾开始遍历
遇到字母就计数
遇到空格且已经开始计数 → 停止
为什么推荐?
不需要额外空间
一次遍历
面试非常加分
解法二:按空格分割字符串
思路
使用 strings.Fields() 按空格切分
取最后一个单词
返回其长度
优点
写起来简单
可读性强
缺点
需要额外内存
四、Go 语言标准解法(推荐版)
✅ 解法一:从后往前遍历(最优)
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// 读取整行输入
str, _ := reader.ReadString('\n')
length := 0
// 从字符串末尾向前遍历
for i := len(str) - 1; i >= 0; i-- {
if str[i] == ' ' || str[i] == '\n' {
// 如果已经开始计数,遇到空格就结束
if length > 0 {
break
}
continue
}
length++
}
fmt.Println(length)
}
五、代码逐行讲解
reader := bufio.NewReader(os.Stdin)
str, _ := reader.ReadString('\n')
使用 bufio 读取一整行(包括空格)
length := 0
用来统计最后一个单词的长度
for i := len(str) - 1; i >= 0; i-- {
从字符串末尾开始遍历
if str[i] == ' ' || str[i] == '\n' {
if length > 0 {
break
}
continue
}
跳过末尾的空格或换行
一旦已经开始计数,再遇到空格 → 说明单词结束
length++
遇到字母,长度加 1
六、常见边界情况(面试会问)
输入 输出
"Hello" 5
"Hello World" 5
" Hello World " 5
"A" 1
" " 0
上面的代码 全部能正确处理。
七、时间 & 空间复杂度
时间复杂度:O(n)
空间复杂度:O(1)
八、总结一句话记住
从字符串末尾开始,数连续字母,遇到第一个空格即停。
