Java数组求第二大元素代码编译错误求助:新手无法定位问题
Java获取数组第二大元素编译错误及逻辑问题修复
问题描述
我是Java新手,编写获取数组中第二大元素的代码时出现编译错误,同时代码还存在逻辑问题,无法得到正确结果。
错误代码
import java.util.*; import java.io.*; public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int tc = Integer.parseInt(br.readLine().trim()); while (tc-- > 0) { String[] inputLine; int n = Integer.parseInt(br.readLine().trim()); int[] arr = new int[n]; inputLine = br.readLine().trim().split(" "); for (int i = 0; i < n; i++) { arr[i] = Integer.parseInt(inputLine[i]); } int ans = new Solution().print2largest(arr, n); System.out.println(ans); } } } // } Driver Code Ends //User function Template for Java class Solution { int print2largest(int arr[], int n) { int large = getLargest(arr,n); int res = -1; for(int i=0;i<n;i++){ if(arr[i]!= arr[large]){ if(res == -1){ res = arr[i]; } else if(arr[i]>arr[res]){ res = arr[i]; } } } return res; } } public static int getLargest(int arr[], int n) { int l = 0; for(int i=0; i<n; i++){ if(arr[i]>arr[l]){ l = i; } } return l; }
报错信息
prog.java:53: error: class, interface, or enum expected public static int getLargest(int arr[], int n) { ^ prog.java:55: error: class, interface, or enum expected for(int i=0; i<n; i++){ ^ prog.java:55: error: class, interface, or enum expected for(int i=0; i<n; i++){ ^ prog.java:55: error: class, interface, or enum expected for(int i=0; i<n; i++){ ^ prog.java:58: error: class, interface, or enum expected } ^
输入输出示例
- 输入示例:
6 12 35 1 10 34 1
- 预期输出:
34
问题分析与修复
1. 编译错误原因
Java不允许在类外部定义方法,你将getLargest方法定义在了Solution类的外部,违反了Java语法规则,导致编译报错。
2. 逻辑错误原因
print2largest方法中,res存储的是数组元素的值而非索引,但后续代码用arr[res]访问数组,会导致数组下标越界(比如元素值34作为下标时,数组长度仅为6,超出范围),正确逻辑应直接比较元素值与res的大小。
修复方案
将getLargest方法移至Solution类内部,修改为私有静态方法(仅类内部使用),同时修正print2largest中的比较逻辑:
修复后代码
import java.util.*; import java.io.*; public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int tc = Integer.parseInt(br.readLine().trim()); while (tc-- > 0) { String[] inputLine; int n = Integer.parseInt(br.readLine().trim()); int[] arr = new int[n]; inputLine = br.readLine().trim().split(" "); for (int i = 0; i < n; i++) { arr[i] = Integer.parseInt(inputLine[i]); } int ans = new Solution().print2largest(arr, n); System.out.println(ans); } } } // } Driver Code Ends //User function Template for Java class Solution { int print2largest(int arr[], int n) { int largeIndex = getLargest(arr,n); int secondLargest = -1; for(int i=0;i<n;i++){ if(arr[i]!= arr[largeIndex]){ if(secondLargest == -1){ secondLargest = arr[i]; } else if(arr[i] > secondLargest){ secondLargest = arr[i]; } } } return secondLargest; } private static int getLargest(int arr[], int n) { int largestIndex = 0; for(int i=0; i<n; i++){ if(arr[i]>arr[largestIndex]){ largestIndex = i; } } return largestIndex; } }
内容的提问来源于stack exchange,提问作者Ayush Kacholiya
相关产品推荐
相关产品推荐

