【JS力扣刷题笔记】151. 翻转字符串里的单词

这篇博客记录了作者在学习算法过程中,针对151题——翻转字符串里的单词的问题,采用双指针法进行解决的过程。文中详细阐述了如何利用左右两个指针从后往前找到每个单词,并将其反转并存入新数组,最终再将数组拼接成字符串。还提到了JavaScript中数组处理undefined的情况,并给出了一段实现代码。

这是跟着代码随想录的顺序学习算法的第十天。

以下是学习时自己的一些理解与笔记,如有错误欢迎指正与讨论。


151. 翻转字符串里的单词

参考相关链接:

151. 翻转字符串里的单词

代码随想录


笔记

代码随想录中的思路,二刷的时候试试自己写一遍。

移除多余空格
将整个字符串反转
将每个单词反转

我做本题的主要思路是用双指针 rightleft 来,从后往前历遍,按顺序找出每个 单词 ,然后放到新的数组 resArr 中,最后再合成字符串。

历遍的详细过程为,先让 right 指针从 s.length - 1 出发,找到第一个 非空格元素 时停下,

left 指针从 right 当前的位置出发往前历遍,找到这个方向上 **最近的一个 空格元素 ** 或者到索引下标为 0 时停止,

此时通过 leftright 就可以确定这个单词的首字母尾字母的索引下标,接着,就可以将其 “提出来” 放到新数组 resArr 中,

然后再让 rightleft 的位置开始继续下一个循环。


值得一提的是,JS 的中的数组索引下标超出其长度时,会是 undefined 而非像 C++ 那样会报错,当数组的方法 push(undfined) 时,undefined 也将会是一个数组元素。数组用resArr.join('') 进行拼接的时候,会直接略过 undefined

而当 join() 的参数变化时,undefined 不会被无视。

const elements = [1, 2,'a',undefined, 3];

console.log(elements.join()); // 1,2,a,,3

console.log(elements.join('')); // 12a3

console.log(elements.join('-')); // 1-2-a--3

**警告:**如果一个元素为 undefinednull,它会被转换为空字符串。

/**
 * @param {string} s
 * @return {string}
 */
var reverseWords = function(s) {
    const resArr = [];
    let right = s.length - 1;
    let left = right; 
    while (right >= 0) {
        if (s[right] !== ' ') {
            left = right;
            while (left >= 0 && s[left] !== ' ') left--;
            // s[left + 1] 至 s[right] 非空格
            if (resArr.length !== 0) resArr.push(' ');
            let temp = right - left;
            while (temp > 0) { 
                // s的索引超出s.length - 1后,
                // 会是undefined,而不会报错!
                resArr.push(s[right - temp + 1]);
                temp--;
            }
            right = left;
        }
        right--;
    }
    return resArr.join('');
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值