题目:输出一个英文句子,翻转句子中单词的程序,但单词内字符的程序不变。为简略起见,标点符号和一般字母一样解决。例如输出字符串”I am a student. “,则输入”student. a am I”。
链接: 力扣Leetcode—剑指Offer—字符串—58 – 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."))
}
提交截图:
发表回复