【软件认证】比特翻转【滑动窗口】

工程师小A在对二进制码流 bits 进行验证,验证方法为:给定目标值 target(0 或 1),最多可以反转二进制码流 bits 中的一位,来获取最大连续 target 的个数,请返回该个数。

输入

第一个参数为 target,值仅为 0 或 1;

第二个参数为 bits, 1 <= bits.length <= 10000,bits[i] 值仅为 0 或 1 。

输出

一个整数,表示最大连续 target 的个数

样例1

复制输入:

1 [0, 1, 1, 0, 1, 0, 1, 0, 0]

复制输出:

4

解释:

0 1 1 0 1 0 1 0 0

目标值为1,表示需要获取最大连续1的个数。

将第二个出现的0反转为1,得到0 1 1 1 1 0 1 0 0 ,获得 4 个连续的1;

其它反转获得连续1的个数最大为3,如 1 1 1 0 1 0 1 0 0 或 0 1 1 0 1 1 1 0 0 。

样例2

复制输入:

0 [0, 0, 0, 0, 0, 0, 0, 0]

复制输出:

8

解释:

不需要反转即可获得最大连续0,个数为8

cpp 复制代码
/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2019. All rights reserved.
 * Description: 上机编程认证
 * Caution:本地调试时,只编译运行bit-fanzhuan.c文件,不要链接这个文件!因为本文件已经被bit-fanzhuan.c文件include了
 */

static int FindMaxConsecutiveBits(int target, const int *bits, size_t bitsSize)
{
    int l = 0;
    int r = 0;
    int max = -1;
    int revseTargetCnt = 0;

    while (r < bitsSize) {
        if (bits[r] == 1 - target) {
            revseTargetCnt++;
        }
        while (revseTargetCnt > 1 && l < bitsSize) {
            if (bits[l] == 1 - target) {
                revseTargetCnt--;
            }
            l++;
        }
        if (max < r - l + 1) {
            max = r - l + 1;
        }
        r++;
    }
    return max;
}
相关推荐
myloveasuka5 分钟前
红黑树、红黑规则、添加节点处理方案
开发语言·算法
沉鱼.446 分钟前
枚举问题集
java·数据结构·算法
2301_810160956 分钟前
C++中的访问者模式高级应用
开发语言·c++·算法
郝学胜-神的一滴7 分钟前
走进计算机图形学的浪漫宇宙 | GAMES101 开篇课程全解析
c++·算法·图形渲染·计算机图形学
没头脑的男大8 分钟前
灵神,2x树的层序遍历,102,103,513
算法
m0_518019489 分钟前
C++中的享元模式
开发语言·c++·算法
我带你来这儿就是为了告诉你我14 分钟前
C++23新特性前瞻
开发语言·c++·算法
陌夏18 分钟前
快速排序 (Quick Sort)
算法
IronMurphy28 分钟前
【算法二十九】 437. 路径总和 III
算法·深度优先
2501_9083298529 分钟前
C++安全编程指南
开发语言·c++·算法