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

求助:调整C语言最长非递减连续序列代码及排查返回0异常

问题分析与修复

你的代码存在三个关键问题:

  • 数组越界访问:循环从i=0开始,第一次迭代时array[i-1]等价于array[-1],属于非法内存访问,会触发未定义行为。正确的起始索引应该是i=1,因为需要比较当前元素和前一个元素(i-1至少为0)。

  • 未处理最后一段序列:当整个数组都是非递减序列时(比如{7,7}),循环中不会触发else分支更新k,导致最终返回初始值0。循环结束后必须额外比较一次running_k和k,确保最后一段序列被统计。

  • 逻辑冗余:array[i] > array[i-1]和array[i] == array[i-1]可以合并为array[i] >= array[i-1],逻辑完全一致且代码更简洁。

修复后的代码

int longest(int array[], unsigned n) {
    // 处理空数组的边界情况
    if (n == 0) {
        return 0;
    }
    int k = 1; // 非空数组的最长序列长度至少为1
    int running_k = 1;
    
    for (int i = 1; i < n; ++i) {
        if (array[i] >= array[i-1]) {
            ++running_k;
        } else {
            if (running_k > k) {
                k = running_k;
            }
            running_k = 1;
        }
    }
    // 循环结束后检查最后一段未更新的序列
    if (running_k > k) {
        k = running_k;
    }
    return k;
}

关键修改说明

  1. 边界处理:增加空数组判断,避免后续逻辑出错。
  2. 初始值调整:k初始化为1,解决了全非递减数组返回0的问题。
  3. 循环起始索引:从i=1开始,彻底避免越界访问。
  4. 合并条件判断:用>=合并大于和等于的情况,简化代码逻辑。
  5. 循环后收尾:额外比较running_k和k,确保最后一段非递减序列被计入最长长度。

测试{1,2,3,4,4,3,2,1}会返回5,{7,7}会返回2,完全符合预期。

内容的提问来源于stack exchange,提问作者user20256195

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 04:15:25