我正在学习Java的半高级课程。我自学了JavaScript作为一种爱好,所以我不是一个真正的初学者,但在制作算法时我并不是很有经验。我们有一个家庭作业问题要做。它遵循以下方式:给定 n 正整数,其中 n&gt; = 5 通过选择两个(不一定是连续的)数字作为因子来找到最大的产品。< / p>
例如,如果输入为:3 6 0 10 4
,则输出应为60
。
这看起来相当容易。我只挑选了最大的两个并乘以它们:
System.out.println("How many numbers will you give me?");
int n = sc.nextInt();
if (n < 5) throw new Error("n must be at least 5");
System.out.println("Enter the numbers");
int max1 = 0, max2 = 0;
for (int i = 0; i < n; ++i) {
int newInt = sc.nextInt();
if (newInt > max1) {
max2 = max1;
max1 = newInt;
} else if (newInt > max2) {
max2 = newInt;
}
}
System.out.println("The largest product is " + (max1 * max2));
这完美无缺。现在,有一个&#34;奖金&#34;或者在此之后延长问题(可选)。我决定尝试一下。问题类似:给定 n (不一定是正数)整数,通过选择两个(不一定是连续的)数字作为因子来找到最大的产品。假设 5&lt; = n&lt; = 25
,程序应在合理的时间内运行旧程序的问题是它会因-6 -5 3 0 4
之类的输入而失败。如果正确答案为12
,则会输出30
。我决定检查绝对值而不是实际值,因此将包括负数。该代码类似于:
System.out.println("How many numbers will you give me?");
int n = sc.nextInt();
if (n < 5) throw new Error("n must be at least 5");
System.out.println("Enter the numbers");
int max1 = 0, max2 = 0;
for (int i = 0; i < n; ++i) {
int newInt = sc.nextInt(), absValue = Math.abs(newInt);
if (absValue > Math.abs(max1)) {
max2 = max1;
max1 = newInt;
} else if (absValue > Math.abs(max2)) {
max2 = newInt;
}
}
System.out.println("The largest product is " + (max1 * max2));
这适用于-6 -5 3 0 4
,正确提供30
但-6 -3 1 5 4
失败。它给出了-30
的答案,这显然是不正确的。
我尝试了一个强力解决方案(检查每个可能的产品),它对n = 5
非常有效但需要n!
次迭代,这意味着n = 25
需要很长时间。
我对如何解决这个问题感到难过。先感谢您。
答案 0 :(得分:10)
问题是检查绝对值会丢弃它们可能为负数的信息。你需要两个正数或两个负数。
实现这一目标的最简单方法是扫描,找到最小的两个和最大的两个数字。
多个最小的两个。乘以两个最大的。无论哪个更大都是你的结果。
答案 1 :(得分:1)
保存在数组(a
)中,对数组进行排序,然后返回max(a[0]*a[1], a[a.length-1]*a[a.length-2])
。