CodeChef最长偶连续子数组题首份Java代码提交不通过排查
CodeChef最长全偶数连续子数组提交错误排查
题目说明
给定长度为N的整数数组,查找所有元素均为偶数的最长连续子数组,输出该子数组的长度。连续子数组指数组中下标连续的一段元素,形式为A_i, A_{i+1}, ..., A_j,其中i、j为合法数组下标。
典型测试样例如下:
- 输入:
3 4 1 2 2 4 3 2 4 6 5 2 3 2 2 5
- 对应预期输出:
3 3 2
问题现象
两份功能目标一致的Java代码表现差异明显:
- 第一份代码在本地IDE手动输入上述样例时可输出匹配预期的结果,但提交至评测平台后所有测试用例均无法通过
- 第二份代码提交后可通过全部测试用例
提交失败的代码
public static void main(String[] args) { Scanner sc = new Scanner(System.in); int t = sc.nextInt(); int j = 0; while(t-- > 0) { int n = sc.nextInt(); int count = 0; int[] arr = new int[n]; for(int i = 0; i < n; i++) { arr[i] = sc.nextInt(); } for(int k = 1; k < n; k++) { j = k-1; if(arr[j]%2==0 && arr[k]%2==0) { count++; } else { j++; } } System.out.println(count+1); } return; }
可全量通过的代码
public static void main (String[] args) throws java.lang.Exception { try { Scanner sc=new Scanner(System.in); int t=sc.nextInt(); while (t-->0) { int n=sc.nextInt(); int count = 0; int res = -1 ; int[] a=new int[n]; for (int i = 0; i < n; i++) { a[i]=sc.nextInt(); } for (int i = 0; i < n; i++) { if (a[i]%2==0) { count++; res = Math.max(count ,res); } else { count = 0; } } System.out.println(res); } } catch(Exception e) { } }
错误根因
第一份代码的核心逻辑存在本质缺陷,本地样例运行正确完全是巧合:
- 计数逻辑完全错误:代码仅统计数组中「相邻两个元素均为偶数」的总对数,最后加1作为结果,既没有在遇到奇数时重置连续计数,也没有对比多段不连续偶数段的长度取最大值。
- 存在无效冗余代码:变量
j定义在所有测试用例循环的外层,但内层数组遍历中每次进入循环都会把j赋值为k-1,else分支中的j++语句不会对计数产生任何影响,属于完全无效的代码。 - 边界场景全覆盖失败:
- 数组全为奇数时,代码会输出
0+1=1,但正确结果应为0; - 数组存在多段不连续偶数时,比如数组
[2,2,3,2,2,2],代码会统计到4组相邻偶数对,输出5,但实际最长连续偶数长度为3; - 数组中存在单独的偶数元素、偶数段位于数组首尾等场景,计数结果均会出错。
给出的3个典型样例刚好满足「数组中只有一段连续偶数,且相邻偶数对总数+1等于该段长度」的条件,错误计算结果和正确值刚好重合,才会出现本地测试正常、提交全错的现象。
- 数组全为奇数时,代码会输出
内容的提问来源于stack exchange,提问作者Aditya Raj Pateriya
相关产品推荐
相关产品推荐

