6、反转字符串中的单词

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

题目

给你一个字符串 s ,请你反转字符串中单词的顺序。
单词:是由非空格字符组成的字符串。
s 中使用至少一个空格将字符串中的单词分隔开。
返回单词顺序颠倒且单词之间用单个空格连接的结果字符串。
注意:输入字符串 s 中可能会存在前导空格、尾随空格或者单词间的多个空格。
返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

示例 1:

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

示例 2:

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

示例 3:

1
2
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. 核心:直接想办法用双指针的完成互换即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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

官方

关键:使用语言特性

1
2
3
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,结束循环

总结

双指针吃天下~


6、反转字符串中的单词
https://mrhzq.github.io/职业上一二事/算法学习/每日算法/6、反转字符串中的单词/
作者
黄智强
发布于
2024年1月13日
许可协议