小白刷题 之 如何高效计算二进制数组中最大连续 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)。

相关推荐
Blue.ztl1 小时前
DP刷题练习(二)
算法·cpp
fengye2071611 小时前
板凳-------Mysql cookbook学习 (十--7)
数据库·学习·mysql
青山是哪个青山1 小时前
位运,模拟,分治,BFS,栈和哈希表
算法·散列表·宽度优先
Zephyrtoria3 小时前
区间合并:区间合并问题
java·开发语言·数据结构·算法
柏箱5 小时前
容器里有10升油,现在只有两个分别能装3升和7升油的瓶子,需要将10 升油等分成2 个5 升油。程序输出分油次数最少的详细操作过程。
算法·bfs
uyeonashi5 小时前
【QT】窗口详解
开发语言·c++·qt·学习
Hello eveybody6 小时前
C++介绍整数二分与实数二分
开发语言·数据结构·c++·算法
囚生CY7 小时前
【学习笔记】Langchain基础(二)
笔记·学习·langchain
几道之旅7 小时前
零基础RT-thread第二节:按键控制
c语言·stm32
Jay_5157 小时前
C语言环形数组(循环队列)详解:原理、实现与应用
c语言·学习·嵌入式·环形数组