题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"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”
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

思路:法一:用库函数

  • 用 strings.TrimSpace(s) 去除字符串前后的空格
  • 用 strings.Split 分割字符串存为一个 []string “b”
  • 将 b 中的字符串翻转
  • 遍历翻转后的字符串,将不为 “” 的字符串加入 res 字符串切片中
  • 将 res 字符串切片连接为一个字符串,之间用 " " 来分隔。

法二:最死板的方法

  • 先去掉空格
  • 再反转字符串
  • 最后反转单词

法一Go代码:

package main

import (
	"fmt"
	"strings"
)

func reverseWords(s string) string {
	var res []string
	a := strings.TrimSpace(s)  // 去除字符串前后的空格
	b := strings.Split(a, " ") // 分割字符串存为一个[]string
	//字符串翻转
	for i := 0; i < len(b)>>1; i++ {
		b[i], b[len(b)-1-i] = b[len(b)-1-i], b[i]
	}
	//处理字符串中间的空格,遍历翻转后的字符串,将不为""的字符串加入 res 字符串切片中
	for i, _ := range b {
		if b[i] != "" {
			res = append(res, b[i])
		}
	}
	//将字符串切片连接为一个字符串,之间用 " " 来分隔。
	return strings.Join(res, " ")
}

func main() {
	fmt.Println(reverseWords("the sky is blue."))
}

提交截图
在这里插入图片描述

法二Go代码:

package main

import (
	"fmt"
)

func reverseWords(s string) string {
	// 去掉空格
	removeEmpty := func(s string) []byte {
		left, right := 0, len(s)-1
		// 去掉头空格
		for left <= right && s[left] == ' ' {
			left++
		}
		// 去掉尾空格
		for left <= right && s[right] == ' ' {
			right--
		}
		// 去掉中间空格
		sb := make([]byte, 0)
		for left <= right {
			if s[left] != ' ' {
				sb = append(sb, s[left])
				// 为空格且末尾不为空格
			} else if sb[len(sb)-1] != ' ' {
				sb = append(sb, s[left])
			}
			left++
		}
		return sb
	}

	// 反转字符串
	reverseString := func(sb []byte, left, right int) {
		for ; left <= right; left, right = left+1, right-1 {
			sb[left], sb[right] = sb[right], sb[left]
		}
	}

	// 反转单词
	reverseWords := func(sb []byte) {
		start, end, n := 0, 0, len(sb)-1
		for start <= n {
			for end <= n && sb[end] != ' ' {
				end++
			}
			// end为空格
			reverseString(sb, start, end-1)
			start, end = end+1, end+1
		}
	}

	sb := removeEmpty(s)
	reverseString(sb, 0, len(sb)-1)
	reverseWords(sb)

	return string(sb)
}

func main() {
	fmt.Println(reverseWords("the sky is blue."))
}

提交截图

在这里插入图片描述