C++实现:查找数组中最长连续元素段的起始索引与长度
我来帮你搞定这个问题!你的核心需求是从数组里找出最长连续0的片段,返回它的起始索引和长度(比如示例{0,1,0,0,0}要返回{2,3})。当前代码只能算出最长连续相同元素的长度,既没限定只统计0,也没追踪起始位置,咱们一步步调整解决:
问题分析
原代码有两个关键局限:
- 没有限定只统计连续0的片段,会把其他连续相同元素(比如连续1)也纳入计算
- 仅追踪了长度,没有记录当前连续段的起始索引,以及最长段的起始位置
修改后的代码实现
我们只需要新增几个变量来追踪起始位置,同时调整判断逻辑聚焦在0的连续段上。下面提供两种实现方式:一种用输出参数返回结果,另一种返回动态分配的数组(更贴合你示例里的返回形式):
#include <stdio.h> #include <stdlib.h> // 方式1:用指针参数返回起始索引和长度 void findIndex(int arr[], int n, int *startIndex, int *length) { // 默认值:如果数组没有0,返回无效索引和0长度 *startIndex = -1; *length = 0; int currentStart = -1; // 当前连续0段的起始索引 int currentLen = 0; // 当前连续0段的长度 for (int i = 0; i < n; i++) { if (arr[i] == 0) { // 遇到0,判断是不是当前段的第一个0 if (currentStart == -1) { currentStart = i; currentLen = 1; } else { currentLen++; } // 如果当前段比已记录的最长段更长,更新记录 if (currentLen > *length) { *length = currentLen; *startIndex = currentStart; } } else { // 遇到非0,重置当前段的追踪变量 currentStart = -1; currentLen = 0; } } } // 方式2:返回动态分配的数组(符合你示例里的返回形式) int* findIndexArray(int arr[], int n) { int *result = (int*)malloc(2 * sizeof(int)); result[0] = -1; // 默认起始索引 result[1] = 0; // 默认长度 int currentStart = -1; int currentLen = 0; for (int i = 0; i < n; i++) { if (arr[i] == 0) { if (currentStart == -1) { currentStart = i; currentLen = 1; } else { currentLen++; } if (currentLen > result[1]) { result[1] = currentLen; result[0] = currentStart; } } else { currentStart = -1; currentLen = 0; } } return result; } // 测试示例 int main() { int arr[] = {0,1,0,0,0}; int n = sizeof(arr)/sizeof(arr[0]); // 测试方式1 int start, len; findIndex(arr, n, &start, &len); printf("起始索引:%d,长度:%d\n", start, len); // 输出:起始索引:2,长度:3 // 测试方式2 int *res = findIndexArray(arr, n); printf("返回数组:{%d, %d}\n", res[0], res[1]); // 输出:返回数组:{2, 3} free(res); // 记得释放动态分配的内存 return 0; }
代码细节说明
currentStart:遇到第一个0时记录索引,连续遇到0就保持这个值,直到碰到非0才重置currentLen:实时统计当前连续0的长度- 每次遇到0都会和已记录的最长长度对比,更长就更新最长长度和对应起始索引
- 如果有多个长度相同的最长连续0段,代码会返回第一个出现的那段;如果要返回最后一个,把判断条件里的
>改成>=就行
边界情况处理
- 数组全是0:比如
{0,0,0},会返回{0,3} - 数组没有0:返回
{-1, 0}(你可以根据需求调整默认返回值)
内容的提问来源于stack exchange,提问作者lob0
相关产品推荐
相关产品推荐

