输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。
示例 1:
输入: "
the sky is blue
"输出: "
blue is sky the
"
示例 2:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
说明:
- 无空格字符构成一个单词。
- 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
- 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
注意:本题与主站 151 题相同:力扣
注意:此题对比原题有改动
思路:见注释
- pre:有效单词的起始位置(不含空格),end:有效单词的结束位置(不含空格)
- 循环过滤s中每个单词之前的若干个空格,continue掉~
- 从每个不为空格的首字符开始,遍历s中的每个单词,并逐步倒序拼接res
- 最后将pre移动到当前遍历完成的单词末尾,准备遍历下一个单词
- 最后要去掉末尾空格(因为是倒序拼接,因此在第一次遍历单词拼接时末尾会多出一个空格,去掉)
时间复杂度:O(N)
空间复杂度:O(1)
funcreverseWords(sstring) string { // 方法1、不利用strings包(推荐)ifs=="" { return"" } res :=""pre, end, length :=0, 0, len(s) forpre<length/*&& end < length*/ { // 循环过滤s中每个单词之前的若干个空格,continue掉~ifs[pre] ==' ' { // 用字符的asc码比较(int32类型)pre++continue } else { // 从每个不为空格的首字符开始,遍历s中的每个单词,并逐步倒序拼接resforend=pre; end<length&&s[end] !=' '; end++ { } res=s[pre:end] +" "+res// 左闭右开,单词间用空格隔开,倒序拼接 pre=end// 最后将pre移动到当前遍历完成的单词末尾,准备遍历下一个单词 } } // 去掉末尾空格(因为是倒序拼接,因此在第一次遍历单词拼接时末尾会多出一个空格,去掉)iflen(res) >0 { res=res[:len(res)-1] } returnres// 方法2、利用strings包// sArr := strings.Split(s, " ")// res := make([]string, 0) // for i := len(sArr)-1; i >= 0; i-- {// r := strings.TrimSpace(sArr[i])// if len(r) > 0 {// res = append(res, r)// }// }// return strings.Join(res, " ")}