转换给定数字,返回最长相同数字的长度(滑窗思想)

题目要求:某系统有连续内存、1表示被占用、0表示内存块被释放,如果释放的内存块,以获得一片最连续、 且比较长的内存块,请返回最长内存块的数量

举例:输入字符串“0010010011000”,输入要释放的个数K,返回最长的内存块个数,

输出:字符串“0010010011000”翻转两个1后,得到最长连续0的个数是8

解题思路:典型的滑窗解法、滑窗的窗内的条件是窗内有K个1。

求解:

    function getContinueMemory2(str, k) {
       let left = 0;
       let right = 0;
       let len = str.length;
       let num = 0; // 1的个数
       let res = 0; // 输出的结果
       while(right < len) {
         // 扩展窗
         if(str[right] === '1') {
            num++;
         }
         // 此时窗内1的个数肯定大于k,因此当值为1时,进行收窗操作
         while(num > k) {
             if(str[left] === '1') {
                 num--;
             }
             left++;
         }
         // 此时,1的个数肯定为k个了,满足窗的条件,对其进行结果输出操作
        res = Math.max(res, right - left +1);
        right++;
       }
       return res;
    }
    console.log(getContinueMemory2('0010010011000', 2));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值