JS刷题!双指针2-找出最长的神奇队列

111 阅读3分钟

1. 题目来源

稀土掘金-双指针No.128-找出最长的神奇队列(简单)-MarsCode

2. 解题思路

题目要求:输入是一个由 01 组成的字符串;我们需要找到最长的「神奇数列」,即交替出现的 01,并且长度至少为 3;如果有多个「神奇数列」,输出最先出现的一个。

  1. 初始化maxLength记录最长神奇数列的长度;maxStart记录最长神奇数列的起始位置
  2. 遍历字符串:外层循环,将当前位置作为起始位置i,初始化length为1;表示当前考虑的子串长度
  3. 找到连续不重复的字符组成的子串:进行内层的while循环,只要当前位置加上长度不超过输入字符串的范围,并且当前位置的下一个字符和当前位置的字符不相等,就将 length 加 1
  4. 更新 **maxLength** **maxStart** 的值:如果长度大于等于 3 且比之前找到的最大长度还长
  5. 函数截取:使用substringmaxStart开始,长度为maxLength的子串作为结果

3. 题解

function solution(inp) {
    // 用于存储找到的最长满足条件的子串的长度
    let maxLength = 0;
    // 用于存储最长满足条件的子串的起始索引
    let maxStart = 0;

    // 外层循环遍历输入字符串的每个字符作为起始位置
    for (let i = 0; i < inp.length; i++){
        // 以当前位置 i 为起始,开始计算满足条件的子串长度,初始长度为 1
        let length = 1;
        // 内层循环,只要不越界且当前字符和前一个字符不相等,则长度加 1
        while(i + length < inp.length && inp[i + length]!= inp[i + length -1]){
            length++;
        }

        // 如果当前找到的子串长度大于等于 3 且比之前找到的最大长度还长
        if(length >= 3 && length > maxLength){
            maxLength = length;
            maxStart = i;
        }
    }
    // 截取并返回满足条件的最长子串
    return inp.substring(maxStart,maxStart + maxLength);
}

function main() {
    // 测试 solution 函数的结果是否满足预期
    console.log(solution("0101011101") === "010101");
    console.log(solution("1110101010000") === "10101010");
    console.log(solution("1010101010101010") === "1010101010101010");
}

main();

4. 关于豆包MarsCode

4.1 推荐使用!

豆包MarsCode简单方便,上手快,能应对日常的编程任务,刷题时也能给你提供不错的解题思路和示例代码,很适合新手和老手,大大提高了工作效率;所以个人挺推荐使用豆包MarsCode去辅助开发!

4.2 HowieCong与MarsCode的经历

  1. 线上参加过两次的字节跳动 X 豆包MarsCode的青训营,积极参与其中,搭配着MarsCode去刷算法题和项目开发真能学到很多
  2. 线下在参加Pycon China 2024上海站时看到了MarsCode参展,MarsCode团队成员非常热情的,拿到了MarsCode的一些周边

❓其他

1. 疑问与作者HowieCong声明

  • 如有疑问、出错的知识,请及时点击下方链接添加作者HowieCong的其中一种联系方式或发送邮件到下方邮箱告知作者HowieCong

  • 若想让作者更新哪些方面的技术文章或补充更多知识在这篇文章,请及时点击下方链接添加里面其中一种联系方式或发送邮件到下方邮箱告知作者HowieCong

  • 声明:作者HowieCong目前只是一个前端开发小菜鸟,写文章的初衷只是全面提高自身能力和见识;如果对此篇文章喜欢或能帮助到你,麻烦给作者HowieCong点个关注/给这篇文章点个赞/收藏这篇文章/在评论区留下你的想法吧,欢迎大家来交流!

2. 作者社交媒体/邮箱-HowieCong