6、反转字符串中的单词

93 阅读2分钟

原题力扣《反转字符串中的单词》

难度中等

题目:

给你一个字符串 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"
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。

提示:

  • 1 <= s.length <= 104
  • s 包含英文大小写字母、数字和空格 ' '
  • s 中 至少存在一个 单词

进阶:如果字符串在你使用的编程语言中是一种可变数据类型,请尝试使用 O(1) 额外空间复杂度的原地解法。

解题:

个人:

关键:双指针

  1. 遇到反转的,都可以先用双指针试试
  2. 单词定义:无空格连接的字符串
  3. 单词分隔:>= 1 个空格
  4. 反转:左边第 n 个单词与右边第 n 个单词进行互换
  5. 输出:单词间一个空格分开,无多余空格的字符串
  6. 核心:直接想办法用双指针的完成互换即可
var reverseWords = function (s) {
  if (!s) return s;

  // 转为数组
  const sArr = s
    .trim()
    .split(" ")
    .map((item) => item.trim())
    .filter((item) => item);

  let left = 0;
  let right = sArr.length - 1;

  // 双指针互换
  while (left < right) {
    const temp = sArr[left];
    sArr[left] = sArr[right];
    sArr[right] = temp;

    ++left;
    --right;
  }

  return sArr.join(" ");
};

耗时:17 min

官方:

关键:使用语言特性

var reverseWords = function(s) {
    return s.trim().split(/\s+/).reverse().join(' ');
};

社区:

关键:双指针

思路:

  1. i、j 共同指向最后一位
  2. i-- 找到第一个空格,则s[i - 1, j] 为一个单词,存放到 res 内;
  3. i-- 继续找到第一个非空格,然后将 j = i,j 与 i 同位
  4. 重复 2
  5. 直到 i < 0,结束循环

总结:

双指针吃天下~