小白刷题 之 如何高效计算二进制数组中最大连续 1 的个数

前言

学习如何快速找出二进制数组中最长的连续 1 序列。

这个问题在数据处理、网络传输和算法面试中经常出现,掌握它不仅能提升编程能力,还能加深对数组操作和循环控制的理解。

🌟 问题背景

想象你是一位网络工程师,正在分析服务器日志中的二进制数据流。你需要快速识别出信号中最长的连续高电平(1)时段,以此来评估设备稳定性。这时,一段高效的 C 语言代码就能帮你轻松解决问题!

🚀 核心功能与实现

我们的目标是:给定一个二进制数组(如 [1,1,0,1,1,1]),计算其中最长的连续 1 序列的长度。以下是完整代码:

复制代码
#include <stdio.h>

int findMaxConsecutiveOnes(int* nums, int numsSize) {
    int max_count = 0;    // 记录全局最大连续1的个数
    int current_count = 0; // 记录当前连续1的个数
    for (int i = 0; i < numsSize; i++) {
        if (nums[i] == 1) {
            current_count++;  // 遇到1,计数器加1
            if (current_count > max_count) {
                max_count = current_count; // 更新最大值
            }
        } else {
            current_count = 0; // 遇到0,重置当前计数器
        }
    }
    return max_count;
}

int main() {
    int nums[] = {1, 1, 0, 1, 1, 1};
    int numsSize = sizeof(nums) / sizeof(nums[0]);
    int result = findMaxConsecutiveOnes(nums, numsSize);
    printf("最大连续1的个数是: %d\n", result);  // 输出: 3
    return 0;
}

🔍 代码详解

让我们把代码拆解成几个关键部分:

1. 变量初始化
复制代码
int max_count = 0;
int current_count = 0;

max_count:像一个 "历史记录器",保存迄今为止发现的最长连续 1 序列。

current_count:像一个 "实时计数器",记录当前正在遍历的连续 1 序列。

2. 循环遍历数组
复制代码
for (int i = 0; i < numsSize; i++) { ... }

逐个检查数组中的每个元素,就像你在检查二进制信号的每个时间点。

3. 核心逻辑:遇到 1 和 0 时的处理
复制代码
if (nums[i] == 1) {
    current_count++;
    if (current_count > max_count) {
        max_count = current_count;
    }
} else {
    current_count = 0;
}

遇到 1:当前计数器加 1,并检查是否需要更新历史记录。

遇到 0:立即重置当前计数器,准备记录下一个可能的连续 1 序列。

4. 主函数与结果输出
复制代码
int main() { ... }

初始化测试数组,调用函数,并打印结果。

🛠️ 如何运行这段代码

  1. 创建文件 :将代码复制到文本编辑器中,保存为 max_ones.c

  2. 编译代码 :打开终端,进入文件所在目录,执行:

    复制代码
    gcc max_ones.c -o max_ones
  3. 运行程序 :在终端输入:

    复制代码
    ./max_ones
  4. 查看结果 :屏幕将显示:

    复制代码
    最大连续1的个数是: 3

📚 知识点总结

数组操作

通过索引访问数组元素(nums[i])。

使用 sizeof 计算数组长度(sizeof(nums) / sizeof(nums[0]))。

循环控制

for 循环的基本用法。

条件判断

if-else 语句的应用。

算法思想

一次遍历:时间复杂度 O (n),高效处理大规模数据。

动态更新:实时维护当前状态和历史最优解。

C 语言基础

函数定义与调用(findMaxConsecutiveOnes)。标准输入输出(printf)。

相关推荐
karmueo462 小时前
视频序列和射频信号多模态融合算法Fusion-Vital解读
算法·音视频·多模态
小汉堡编程3 小时前
数据结构——vector数组c++(超详细)
数据结构·c++
写代码的小球5 小时前
求模运算符c
算法
雾里看山6 小时前
顺序表VS单链表VS带头双向循环链表
数据结构·链表
DKPT6 小时前
Java桥接模式实现方式与测试方法
java·笔记·学习·设计模式·桥接模式
学不动CV了8 小时前
ARM单片机启动流程(二)(详细解析)
c语言·arm开发·stm32·单片机·51单片机
大千AI助手8 小时前
DTW模版匹配:弹性对齐的时间序列相似度度量算法
人工智能·算法·机器学习·数据挖掘·模版匹配·dtw模版匹配
好好研究9 小时前
学习栈和队列的插入和删除操作
数据结构·学习
YuTaoShao10 小时前
【LeetCode 热题 100】48. 旋转图像——转置+水平翻转
java·算法·leetcode·职场和发展