题目
给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格
一、Go 语言实现
import "strings"
func reverseWords(s string) string {
// 分割字符串为单词数组(自动处理多余空格)
words := strings.Fields(s)
// 反转单词数组
for i, j := 0, len(words)-1; i < j; i, j = i+1, j-1 {
words[i], words[j] = words[j], words[i]
}
// 用单个空格连接单词
return strings.Join(words, " ")
}
二、算法分析
1. 核心思路
• 分割单词:利用 strings.Fields
自动处理多余空格,直接提取单词数组。
• 反转数组:双指针法反转单词顺序。
• 拼接结果:用单个空格连接反转后的单词数组。
2. 关键步骤
- 处理空格:
strings.Fields
自动忽略前导、尾随和单词间多余的空格。 - 反转单词:通过双指针交换首尾单词,逐步向中间移动。
- 拼接字符串:使用
strings.Join
保证单词间仅有一个空格。
3. 复杂度
• 时间复杂度:O(n)
,分割和拼接字符串各需 O(n)
,反转单词数组需 O(m)
(m
为单词数量,远小于 n
)。
• 空间复杂度:O(n)
,存储单词数组和结果字符串。
三、 图解
四、边界 条件与扩展
- 全空格输入:
s = " "
→ 分割为[]
→ 返回空字符串""
。 - 单单词输入:
s = "Hello"
→ 直接返回"Hello"
。 - 无额外空格:
s = "a b c"
→ 返回"c b a"
。 - 大小写混合:如
s = "Hello WORLD"
→ 反转后保持原样"WORLD Hello"
。
五、 总结
• 核心逻辑:分割→反转→拼接,直接利用标准库简化代码。
• 关键优化:strings.Fields
自动处理空格,避免手动遍历。
• 适用场景:类似“按规则重组字符串”的问题可参考此思路。