算法练习第33题-翻转字符串里的单词

155 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第17天,点击查看活动详情

一、题目

给你一个字符串 s ,颠倒字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

示例 1:

输入:s = "the sky is blue"
输出:"blue is sky the"

示例 2:

输入:s = "  hello world  "
输出:"world hello"
解释:颠倒后的字符串中不能存在前导空格和尾随空格。


示例 3:

输入:s = "a good   example"
输出:"example good a"
解释:如果两个单词间有多余的空格,颠倒后的字符串需要将单词间的空格减少到仅有一个。

作者:力扣 (LeetCode) 链接:leetcode-cn.com/leetbook/re… 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

二、思路

思路1

  • 首先看下例子三
  • 它中中间有多个空格,首先我们要将这种情况排除掉
  • 那么就通过while循环
  • 判断的条件是只有(s[i] != ' ' || s[i - 1] != ' ')
  • 也就是前后只能有一个空格时才能通过
  • 通过叠加拿到的数据就是只有一个空格的数据
  • 之后我们通过split(' ')切割成数组,然后用reverse()做下倒叙,再通过join(' ')拼接
  • 这样就得到数据了

思路2

  • 优化方案
  • 通过正则匹配处理多余的空格 \s 匹配任何空白字符 +匹配前面的子表达式一次或者多次

三、代码

执行代码1

let reverseWords = function(s) {
  /**
   * 首先看下例子三
   * 它中中间有多个空格,首先我们要将这种情况排除掉
   * 那么就通过while循环
   * 判断的条件是只有(s[i] != ' ' || s[i - 1] != ' ')
   * 也就是前后只能有一个空格时才能通过
   * 通过叠加拿到的数据就是只有一个空格的数据
   * 之后我们通过split(' ')切割成数组,然后用reverse()做下倒叙,再通过join(' ')拼接
   * 这样就得到数据了
   * 
   * */ 
  let len = s.length, index = 1, i = 1, newStr = s[0]
  while(i < len) {
    if(s[i] != ' ' || s[i - 1] != ' ') {
      newStr += s[i]
      index++
    }
    i++
  }
  let newArr = newStr.trim().split(' ').reverse().join(' ')
  return newArr
}
reverseWords(s)

代码1优化

let reverseWords = function(s) {
  /**
   * 优化方案
   * 通过正则匹配处理多余的空格 \s 匹配任何空白字符 +匹配前面的子表达式一次或者多次
   * 
   * */ 
  let newArr = s.trim().split(/\s+/).reverse().join(' ')
  return newArr
}
reverseWords(s)

四、测试用例

示例1

image.png

示例2

image.png