题目要求:某系统有连续内存、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));