小白刷题 之 如何高效计算二进制数组中最大连续 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,计数器加1if (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); // 输出: 3return 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() { ... }
初始化测试数组,调用函数,并打印结果。
🛠️ 如何运行这段代码
- 创建文件:将代码复制到文本编辑器中,保存为
max_ones.c
。 - 编译代码:打开终端,进入文件所在目录,执行:
gcc max_ones.c -o max_ones
- 运行程序:在终端输入:
./max_ones
- 查看结果:屏幕将显示:
最大连续1的个数是: 3
📚 知识点总结
数组操作:
通过索引访问数组元素(nums[i]
)。
使用 sizeof
计算数组长度(sizeof(nums) / sizeof(nums[0])
)。
循环控制:
for
循环的基本用法。
条件判断:
if-else
语句的应用。
算法思想:
一次遍历:时间复杂度 O (n),高效处理大规模数据。
动态更新:实时维护当前状态和历史最优解。
C 语言基础:
函数定义与调用(findMaxConsecutiveOnes
)。标准输入输出(printf
)。