给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
示例 1:
输入:s = “the sky is blue”
输出:“blue is sky the”示例 2:
输入:s = " hello world "
输出:“world hello”
解释:反转后的字符串中不能存在前导空格和尾随空格。示例 3:
输入:s = “a good example”
输出:“example good a”
解释:如果两个单词间有多余的空格,反转后的字符串需要将单>词间的空格减少到仅有一个。提示:
1 <= s.length <= 104
s 包含英文大小写字母、数字和空格 ’ ’
s 中 至少存在一个 单词进阶:如果字符串在你使用的编程语言中是一种可变数据类型,请尝试使用 O(1) 额外空间复杂度的 原地 解法。
对于这道题,我们可以将字符串按照空白字符串分隔来得到字符串单词数组,然后对该单词数组反转,即可得到最终结果
func reverseWords(s string) string {
// 单词数组
words := make([]string, 0)
// 当前单词的开始下标
var start = -1
// 遍历字符串,提取单词数组
for i := 0; i < len(s); i++ {
if start == -1 && s[i] != ' ' {
// 如果当前单词还不存在开始下标,并且当前字符不为空格,则意味着字符是当前单词的开始,更新当前单词开始下标
start = i
} else if start >= 0 && s[i] == ' ' {
// 当前单词存在开始下标,并且当前字符为空格,则意味着当前单词已遍历完毕,当前下标就是当前单词结束下标的下一个,追加当前单词,取消下个单词的开始下标
words = append(words, s[start:i])
start = -1
}
}
if start >= 0 {
// 当前单词存在开始下标,意味着当前单词不存在空格,因为遇到空格当前单词会被追加,并且取消开始下标,应此可以放心的追加当前单词
words = append(words, s[start:len(s)])
}
// 单词数据的长度
l := len(words)
// 单词数组的长度的一半
n := l >> 1
l--
// 遍历单词数组的左半边,反转单词数组
for i := 0; i < n; i++ {
// 对换当前单词和当前单词沿单词数组的中心轴对称的单词
words[i], words[l-i] = words[l-i], words[i]
}
return strings.Join(words, " ")
}