algorighm/top-interview-leetcode150/numbers-and-strings/151反转字符串中的单词.js

77 lines
2.2 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 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;
}