Codeforces 1772C问题Java代码输出异常,请求错误排查
问题背景
给定以下Java代码,输入5和数组[0,2,8,10,16]时,代码输出0,但预期结果大于0,需排查代码错误:
import java.util.Arrays; import java.util.Scanner; class Codechef { static boolean test(int[]a,int n){ for(int i=0;i<n;i++){ if(a[i]-a[i+1]>0) System.out.println("not si"); return false; } return true; } static int[] array(int[]a,int n){ int[] a1=new int[n-1]; if(test(a,n )){ for(int i=0;i<n-1;i++){ a1[i]=a[i+1]=a[i]; } } return a1; } static int type(int[]a,int n){ int c=0; int []k=array(a, n); Arrays.sort(k); for(int i=0;i<n-2;i++){ if(k[i]!=k[i+1])c++; } return c; } public static void main(String[] args) { Scanner in=new Scanner(System.in); System.out.println("Array & no of elements"); int n=in.nextInt(); int []a=new int[n]; for(int i=0;i<n;i++) a[i]=in.nextInt(); int c=type(a, n); System.out.println(c); } }
输入内容:
5 0 2 8 10 16
代码输出0,预期结果大于0,以下是代码中的关键错误:
1. test方法的致命逻辑错误
- 数组越界风险:循环条件
i < n会导致当i = n-1时,访问a[i+1]超出数组的合法下标范围(数组长度为n,最大下标为n-1)。 - 代码块无大括号导致逻辑失效:
if语句后未用大括号包裹执行代码,且return false直接写在循环体内——无论if条件是否成立,第一次循环都会执行return false,导致方法永远返回false,完全没有遍历数组判断是否非递增。比如输入的数组是严格递增的,本应返回true,但实际直接返回false。
2. array方法的赋值与逻辑错误
- test返回false时数组未正确初始化:当
test错误返回false时,a1数组仅完成默认初始化(所有元素为0),没有任何业务逻辑赋值,最终返回全0数组。 - 错误的赋值语句:即使
test返回true,a1[i]=a[i+1]=a[i]的逻辑完全偏离需求——这会修改原数组的a[i+1]为a[i],同时把该值赋给a1[i],完全没有实现题目需要的相邻元素差计算(或其他核心逻辑)。
3. type方法的统计逻辑偏差
- 循环边界错误:循环条件
i < n-2对应k数组(长度为n-1)的遍历范围不足,会遗漏最后一对相邻元素的比较。 - 统计逻辑不符合需求:代码统计的是相邻不同元素的出现次数,而根据输入的预期(相邻差为
[2,6,2,6],不同的差有2种),应该统计的是不同元素的种类数,而非相邻不同的次数。
错误验证
输入的数组是严格递增的,但test方法第一次循环就返回false,导致array返回全0数组[0,0,0,0],排序后仍为全0,type方法遍历后统计到0次相邻不同,最终输出0,与预期结果不符。
内容的提问来源于stack exchange,提问作者StackpackedKar
相关产品推荐
相关产品推荐

