77 lines
2.2 KiB
JavaScript
77 lines
2.2 KiB
JavaScript
/**
|
||
* https://leetcode.cn/problems/reverse-words-in-a-string/?envType=study-plan-v2&envId=top-interview-150
|
||
* @param {string} s
|
||
* @return {string}
|
||
*/
|
||
const reverseWords = function (s) {
|
||
return f1(s);
|
||
};
|
||
|
||
function f1(s) {
|
||
// 去除首尾空格并初始化一个空数组来收集单词
|
||
const words = [];
|
||
let currentWord = '';
|
||
|
||
// 遍历字符串
|
||
for (let i = 0; i < s.length; i++) {
|
||
const char = s[i];
|
||
|
||
if (char !== ' ') {
|
||
// 当前字符不是空格,拼接到currentWord
|
||
currentWord += char;
|
||
} else if (currentWord !== '') {
|
||
// 当前字符是空格,且currentWord非空,说明找到一个单词,push到words数组
|
||
words.push(currentWord);
|
||
currentWord = ''; // 重置currentWord
|
||
}
|
||
}
|
||
|
||
// 如果最后一个字符不是空格,可能会有一个单词没有被加进去
|
||
if (currentWord !== '') {
|
||
words.push(currentWord);
|
||
}
|
||
|
||
// 反转单词数组并用单空格连接返回
|
||
return words.reverse().join(' ');
|
||
}
|
||
|
||
/*
|
||
技巧项的方式,直接用正则匹配空格字符分割成想的单词字符串数组,之后反转数组再拼
|
||
*/
|
||
function f2(s) {
|
||
const reverseWords = function (s) {
|
||
// 去除多余的空格并按空格分割为单词
|
||
const words = s.trim().split(/\s+/); // 使用正则去掉多余空格
|
||
|
||
// 反转单词数组并用单空格连接
|
||
return words.reverse().join(' ');
|
||
};
|
||
}
|
||
|
||
/*
|
||
利用栈,首先对字符串s做trim处理,之后遍历整个字符串,如果当前字符不等于" "直接压入栈中,如果当前字符是" "检查栈顶元素是否是
|
||
" ",如果栈顶元素是空就跳过,否则就压入栈中
|
||
*/
|
||
function f3(s) {
|
||
const stack = []; // js的数组由栈的特性,直接使用即可
|
||
let isPrevSpace = true; // 标记栈顶元素,js数组没有提供peek方法
|
||
s = s.trim();
|
||
for (let i = 0; i < s.length; i++) {
|
||
if (s[i] !== ' ') {
|
||
stack.push(s[i]);
|
||
isPrevSpace = false;
|
||
} else if (!isPrevSpace) {
|
||
stack.push(s[i]);
|
||
isPrevSpace = true;
|
||
}
|
||
}
|
||
|
||
// 最后通过栈弹出并拼接成结果,
|
||
// return stack.reverse().join('');
|
||
let res = '';
|
||
while (stack.length >= 0) {
|
||
res += stack.pop();
|
||
}
|
||
return res;
|
||
}
|