求助:调整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; }
关键修改说明
- 边界处理:增加空数组判断,避免后续逻辑出错。
- 初始值调整:
k初始化为1,解决了全非递减数组返回0的问题。 - 循环起始索引:从
i=1开始,彻底避免越界访问。 - 合并条件判断:用
>=合并大于和等于的情况,简化代码逻辑。 - 循环后收尾:额外比较
running_k和k,确保最后一段非递减序列被计入最长长度。
测试{1,2,3,4,4,3,2,1}会返回5,{7,7}会返回2,完全符合预期。
内容的提问来源于stack exchange,提问作者user20256195
相关产品推荐
相关产品推荐

