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