题目

点击前往

给你一个字符串 s ,逐个翻转字符串中的所有 单词 。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。
说明:
* 输入字符串 s 可以在前面、后面或者单词间包含多余的空格。
* 翻转后单词间应当仅用一个空格分隔。
* 翻转后的字符串中不应包含额外的空格。

示例1:

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

示例2:

1
2
3
输入:s = "  hello world  "
输出:"world hello"
解释:输入字符串可以在前面或者后面包含多余的空格,但是翻转后的字符不能包括。

解题思路

  • 方法一:调用库函数直接操作。
  • 方法二:自定义函数。

自定义函数

创建去空格函数

  • 依题意需要去除的空格类型包括:
    • 字符串开头结尾的空格;
    • 连续空格只保留一个。
  • 这里利用双指针法:
    • fast指针走得快,slow指针走得慢;
    • 当fast指针遇到空格时进行判断,如果出现以上两种情况就将fast指针继续向前走;否则,将fast指针指向的位置的元素赋予给slow指针对应元素,然后同时移动两个指针。
  • 最后利用slow指针来去除结尾空格,然后控制整个字符串长度。
1
2
3
4
5
6
7
8
9
10
11
function dp(arr){
let fast = 0, slow = 0;
while(fast < arr.length){
if(arr[fast]===" " && (fast ===0 || arr[fast-1]===" ")){
fast++;
}else{
arr[slow++] = arr[fast++];
}
}
arr.length = arr[slow - 1] === " " ? slow -1 : slow;
}

创建翻转函数

  • 这里翻转函数先用来对整个数组进行翻转,然后利用空格为间隔将每个单词进行翻转。
1
2
3
4
5
6
7
8
9
function reversefun(arr,start,end){
let left = start;
let right = end;
while(left < right){
[arr[left],arr[right]] = [arr[right],arr[left]];
left++;
right--;
}
}

函数整体

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/**
* @param {string} s
* @return {string}
*/
var reverseWords = function(s) {
let arr = Array.from(s);
dp(arr);
reversefun(arr, 0,arr.length-1);
let start = 0;
for(let i=0; i<= arr.length;i++){
if(arr[i]===' ' || i ===arr.length){
reversefun(arr,start,i-1);
start = i+1;
}
}
return arr.join("");
};

function dp(arr){
let fast = 0, slow = 0;
while(fast < arr.length){
if(arr[fast]===" " && (fast ===0 || arr[fast-1]===" ")){
fast++;
}else{
arr[slow++] = arr[fast++];
}
}
arr.length = arr[slow - 1] === " " ? slow -1 : slow;
}

function reversefun(arr,start,end){
let left = start;
let right = end;
while(left < right){
[arr[left],arr[right]] = [arr[right],arr[left]];
left++;
right--;
}
}