You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:11:02