原题链接:151. 翻转字符串里的单词
解题思路:
- 从前向后遍历
s
,非空格都为单词,将单词依次存入栈。 - 将单词依次出栈,用空格间隔,连接成新字符串,即可实现翻转。
/**
* @param {string} s
* @return {string}
*/
var reverseWords = function (s) {
let stack = []; // 使用栈存储字符串中的单词
let word = ''; // 临时缓存单词
let result = ''; // 存储翻转后字符串
// 遍历字符串,查找所有单词
for (let i = 0; i < s.length; i++) {
// 如果遇到空格,且已找到单词,就将其存入栈
if (s[i] === ' ' && word !== '') {
stack.push(word);
word = ''; // 单词入栈后,清空缓存
} else if (s[i] !== ' ') {
// 如果遇到非空格字符,表示遇到了单词,将其存入word
word += s[i];
}
}
// 如果遍历完成后,还有单词,继续入栈
// 避免最后一个单词被忽略
if (word) {
stack.push(word);
}
// 将末尾单词第一个存入结果
result += stack.pop();
// 将栈中元素依次出栈,实现翻转
while (stack.length) {
// 单词之间用空格隔开
result += ' ' + stack.pop();
}
// 返回结果
return result;
};
- 可以将
s
直接用空格切割成数组,即可成为一个栈。
/**
* @param {string} s
* @return {string}
*/
var reverseWords = function (s) {
// 将字符串切割为数组,自然按照栈的顺序排列
let stack = s.trim().split(/\s+/);
let word = ''; // 临时缓存单词
let result = ''; // 存储翻转后字符串
// 如果遍历完成后,还有单词,继续入栈
// 避免最后一个单词被忽略
if (word) {
stack.push(word);
}
// 将末尾单词第一个存入结果
result += stack.pop();
// 将栈中元素依次出栈,实现翻转
while (stack.length) {
// 单词之间用空格隔开
result += ' ' + stack.pop();
}
// 返回结果
return result;
};