新手求助:求给定整数数组中两数最大乘积的Java程序实现
代码逐点修复说明
先梳理当前代码跑不起来的硬伤,再顺着你原本的实现思路改成可运行版本,最后附上更高效的实现参考:
当前代码中的必错点
- 结构语法错误:类和方法的大括号嵌套错位,
maxProduct方法写完就多打了一个闭合大括号,直接把类给提前闭合,导致后面的main方法跑到类外部,编译器会直接抛出语法错误。 - 未定义变量错误:方法末尾写的
return maxProduct;对应的变量从来没有声明过,代码里只定义了参与乘积的两个临时变量a、b,全程没有单独存储计算出的乘积结果,无法通过编译。 - 比较逻辑错误:双重循环里的判断条件,全程拿数组头两个元素的乘积
arr[0]*arr[1]当固定比较基准,哪怕循环中途已经遇到更大的乘积,后续遍历还是和这个最开始的固定值对比,根本没法动态更新最大值,就算编译通过结果也是错的。
保留你原有思路的可运行修复版
完全保留双重循环遍历所有数对的逻辑(对新手友好、好理解),只修正上面提到的错误:
import java.util.*; public class Source { static int maxProduct(int arr[]) { int n = arr.length; if (n < 2) { System.out.println("NA"); return Integer.MIN_VALUE; } // 单独存储当前找到的最大乘积,初始值为数组头两个元素的乘积 int maxProduct = arr[0] * arr[1]; for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { int currentProduct = arr[i] * arr[j]; // 和当前记录的最大乘积对比,不再和固定的头两个元素乘积比 if (currentProduct > maxProduct) { maxProduct = currentProduct; } } } // 返回已定义的maxProduct变量 return maxProduct; } public static void main(String[] args) { Scanner s = new Scanner(System.in); int size = s.nextInt(); int[] arr = new int[size]; for (int i = 0; i < size; i++) { arr[i] = s.nextInt(); } int answer = maxProduct(arr); System.out.print(answer); } }
注:双重循环的时间复杂度为O(n²),数组长度较小时完全可用;如果数组长度较大,会存在性能瓶颈。
更高效率的O(n)实现思路
不需要双重循环,一次遍历即可完成计算:
- 遍历数组时记录两个关键值:数组中最大的两个数、数组中最小的两个数
- 两个最大数的乘积、两个最小数的乘积(两个负数相乘为正,往往绝对值更大),两者取更大值就是目标结果
小提醒:如果数组元素乘积可能超过int类型的取值范围,记得把存储乘积的变量换成long类型,避免数值溢出得到错误结果。
内容的提问来源于stack exchange,提问作者Aprameya Jamadagni
相关产品推荐
相关产品推荐

