剑指 Offer 58 - I. 翻转单词顺序

简介: 剑指 Offer 58 - I. 翻转单词顺序

 剑指 Offer 58 - I. 翻转单词顺序

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"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, " ")}

      image.gif


      目录
      相关文章
      |
      6月前
      |
      C++
      剑指 Offer 58 - I:翻转单词顺序(c++字符串常用处理方法)
      剑指 Offer 58 - I:翻转单词顺序(c++字符串常用处理方法)
      40 0
      |
      6月前
      剑指 Offer 38:字符串的排列
      剑指 Offer 38:字符串的排列
      46 0
      |
      6月前
      剑指 Offer 57 - II:和为s的连续正数序列
      剑指 Offer 57 - II:和为s的连续正数序列
      30 0
      |
      6月前
      剑指 Offer 50:第一个只出现一次的字符
      剑指 Offer 50:第一个只出现一次的字符
      35 0
      |
      6月前
      剑指Offer LeetCode 面试题58 - I. 翻转单词顺序
      剑指Offer LeetCode 面试题58 - I. 翻转单词顺序
      39 0
      图解LeetCode——剑指 Offer 58 - I. 翻转单词顺序
      图解LeetCode——剑指 Offer 58 - I. 翻转单词顺序
      95 1
       图解LeetCode——剑指 Offer 58 - I. 翻转单词顺序
      |
      算法
      图解LeetCode——剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
      图解LeetCode——剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
      100 1
      剑指offer 65. 翻转单词顺序
      剑指offer 65. 翻转单词顺序
      58 0