关于golang:Golang力扣Leetcode剑指Offer字符串58-I-翻转单词顺序库函数

10次阅读

共计 1713 个字符,预计需要花费 5 分钟才能阅读完成。

题目 :输出一个英文句子,翻转句子中单词的程序,但单词内字符的程序不变。为简略起见,标点符号和一般字母一样解决。例如输出字符串 ”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."))
}

提交截图

正文完
 0