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

工程师小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;
}
相关推荐
源代码•宸18 小时前
Leetcode—1123. 最深叶节点的最近公共祖先【中等】
经验分享·算法·leetcode·职场和发展·golang·dfs
s砚山s18 小时前
代码随想录刷题——二叉树篇(十三)
数据结构·算法
alphaTao18 小时前
LeetCode 每日一题 2026/1/5-2026/1/11
算法·leetcode
山上三树18 小时前
详细介绍 C 语言中的 #define 宏定义
c语言·开发语言·算法
AI科技星18 小时前
引力与电磁的动力学耦合:变化磁场产生引力场与电场方程的第一性原理推导、验证与统一性意义
服务器·人工智能·科技·线性代数·算法·机器学习·生活
蜕变菜鸟18 小时前
JS的Object.keys()和sort()排序的用法
数据结构·算法
源代码•宸18 小时前
Golang基础语法(go语言error、go语言defer、go语言异常捕获、依赖管理、Go Modules命令)
开发语言·数据库·后端·算法·golang·defer·recover
如果你想拥有什么先让自己配得上拥有19 小时前
算数顺序的逻辑和发展?
算法
Cx330❀19 小时前
【优选算法必刷100题】第43题(模拟):数青蛙
c++·算法·leetcode·面试