【JS】反转字符串中的单词
题目
思路
- 先去除多余空格,使用快慢指针法,参考双指针法(快慢指针)解决元素移除问题
- 再反转整个字符串,参考【JS】反转字符串题目怎么写
- 使用循环再分别把每段字符反转回来
示例代码
/**
* @param {string} s - 输入的字符串
* @return {string} - 翻转单词后的字符串
*/
var reverseWords = function(s) {
// 将输入的字符串转换为字符数组
const strArr = Array.from(s);
// 调用函数移除字符数组中多余的空格,包括开头、中间连续的空格以及末尾的空格
removeExtraSpaces(strArr);
// 调用函数对整个字符数组进行翻转操作,即将整个字符串的字符顺序颠倒
reverse(strArr, 0, strArr.length - 1);
let start = 0;
// 遍历字符数组,用于定位每个单词的起始和结束位置并进行单词翻转
for(let i = 0; i <= strArr.length; i++) {
// 当遇到空格或者到达字符数组的末尾时,表示一个单词结束
if (strArr[i] === ' ' || i === strArr.length) {
// 调用函数对当前单词(从start到i - 1位置的字符)进行翻转
reverse(strArr, start, i - 1);
// 更新下一个单词的起始位置为当前空格的下一个位置
start = i + 1;
}
}
// 将处理后的字符数组重新拼接成字符串并返回
return strArr.join('');
};
// 定义函数用于删除字符数组中多余的空格
function removeExtraSpaces(strArr) {
let slowIndex = 0;
let fastIndex = 0;
// 遍历字符数组,fastIndex用于快速移动,slowIndex用于记录有效字符的位置
while(fastIndex < strArr.length) {
// 如果当前字符是空格,并且是字符串开头的空格或者前一个字符也是空格,
// 则说明是多余的空格,直接跳过,fastIndex向后移动一位
if (strArr[fastIndex] === ' ' && (fastIndex === 0 || strArr[fastIndex - 1] === ' ')) {
fastIndex++;
} else {
// 如果当前字符不是多余的空格,则将其赋值到slowIndex位置,
// 然后slowIndex和fastIndex都向后移动一位
strArr[slowIndex++] = strArr[fastIndex++];
}
}
// 如果最后一个字符是空格,说明末尾有多余的空格,需要去除
//因为每次将有效字符赋值给 strArr[slowIndex] 后,slowIndex 都会自增 1,所以 slowIndex - 1 就是最后一个有效字符的位置
// 通过判断slowIndex - 1位置的字符是否为空格来决定是否更新字符数组的长度
strArr.length = strArr[slowIndex - 1] === ' '? slowIndex - 1 : slowIndex;
}
// 定义函数用于翻转字符数组中指定区间内的字符
function reverse(strArr, start, end) {
let left = start;
let right = end;
while (left < right) {
[strArr[left], strArr[right]] = [strArr[right], strArr[left]];
left++;
right--;
}
}
欢迎指正!