OM与ADDY最长非零连续Streak计算结果异常排查
问题排查与修复
首先明确测试用例的正确最长连续非零Streak:
- OM的数组
[1,7,3,0,2,13]:最长连续非零段为前3个元素,长度3 - ADDY的数组
[0,2,3,4,5,0]:最长连续非零段为中间4个元素,长度4
程序输出DRAW说明代码计算出的两个最长值相等,大概率是ADDY的Streak被错误计算为3,以下是核心错误点排查及修复方案:
常见错误点及修复
1. 遇0时的处理顺序错误
这是最可能导致问题的原因:如果代码先重置当前Streak计数,再更新最大值,会导致连续非零段的长度还没来得及和最大值比较就被清零。
错误示例:
// 处理ADDY数组的错误逻辑 int current_b = 0, max_b = 0; for (int i = 0; i < n; i++) { if (b[i] != 0) { current_b++; } else { // 错误:先重置计数,再比较更新最大值 current_b = 0; if (current_b > max_b) { max_b = current_b; } } }
当处理ADDY数组最后一个0时,current_b先被置为0,再和max_b比较,此时max_b仍为3,最终两个最大值均为3,输出DRAW。
正确逻辑:
int current_b = 0, max_b = 0; for (int i = 0; i < n; i++) { if (b[i] != 0) { current_b++; } else { // 正确:先比较更新最大值,再重置计数 if (current_b > max_b) { max_b = current_b; } current_b = 0; } }
2. 遍历结束后未检查最后一段连续非零序列
如果数组末尾是连续非零元素,循环结束后当前计数还未与最大值比较,会导致最大值未更新。即使你的测试用例末尾是0,也建议补上这一步以覆盖所有场景:
// 循环结束后,检查最后一段连续非零长度 if (current_b > max_b) { max_b = current_b; }
3. 初始化值错误
确保计数变量和最大值变量初始化为0,避免初始值导致的计数偏差:
int current_a = 0, max_a = 0; int current_b = 0, max_b = 0;
4. 循环边界错误
如果循环条件写成i < n-1,会漏掉最后一个元素,导致末尾的0未被处理,同样会使ADDY的最大值停留在3。需确保循环条件为i < n。
完整正确示例代码
#include <stdio.h> int main() { int t = 1; while (t--) { int n = 6; int a[] = {1,7,3,0,2,13}; int b[] = {0,2,3,4,5,0}; int current_a = 0, max_a = 0; int current_b = 0, max_b = 0; // 计算OM的最长连续非零Streak for (int i = 0; i < n; i++) { if (a[i] != 0) { current_a++; } else { if (current_a > max_a) { max_a = current_a; } current_a = 0; } } if (current_a > max_a) max_a = current_a; // 计算ADDY的最长连续非零Streak for (int i = 0; i < n; i++) { if (b[i] != 0) { current_b++; } else { if (current_b > max_b) { max_b = current_b; } current_b = 0; } } if (current_b > max_b) max_b = current_b; // 输出结果 if (max_a > max_b) { printf("OM\n"); } else if (max_b > max_a) { printf("ADDY\n"); } else { printf("DRAW\n"); } } return 0; }
内容的提问来源于stack exchange,提问作者Yash Sachdeva
相关产品推荐
相关产品推荐

