在此程序中,数组和数组元素的大小取自用户。
这段代码通过了我尝试过但无法通过的所有情况,其中数组的大小为4,元素为{5,5,5,2}
这里的输出应该是5 5 5
但是我得到2 2 5
我能够找出问题所在。
else if((max1 == max2 && max2 == max3 && max1 == max3) && x[i] < max2)
{
max2 = x[i];
if(max2 < max3)
{
max3 = max2;
}
}
如何仅使用数组解决此问题。在集合中不需要解决方案。
import java.util.*;
class ThirdLargest
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
System.out.println("Enter size for array: ");
int size = sc.nextInt();
int[] x = new int[size];
for(int i = 0; i < x.length; i++)
{
System.out.println("Enter elements for array: ");
x[i] = sc.nextInt();
}
System.out.println("Array is: ");
for(int i = 0; i < x.length; i++)
{
System.out.print(x[i] +" ");
}
System.out.println();
if (x.length >= 3)
{
int max1 = x[0], max2 = x[0], max3 = x[0];
for (int i = 1; i < x.length; i++)
{
if(x[i] > max1)
{
max3 = max2;
max2 = max1;
max1 = x[i];
}
else if(x[i] > max2)
{
max3 = max2;
max2 = x[i];
}
else if (x[i] > max3)
{
max3 = x[i];
}
else if((max1 == max2 && max2 == max3 && max1 == max3) && x[i] < max2)
{
max2 = x[i];
if(max2 < max3)
{
max3 = max2;
}
}
else if(max2 == max3 && x[i] < max3)
{
max3 = x[i];
}
}
System.out.println("3rd, 2nd and 1st maximum: " + max3 +" "+max2+" "+max1);
}
else
{
System.out.println("Array size is short");
}
}
}
最佳答案
问题在于数组中重复的整数不能作为唯一元素来跟踪。
当您在纸上查看数组x = [5, 5, 5, 2]
时,您会看到有三个唯一的int
元素值5
,因此三个最大的元素应该是5, 5, 5
,但是现在达到该值时测试的方式在数组末尾的2
,它不知道max3
,max2
和max1
分别代表ints
,5
和x[0]
的三个不同的x[1]
值x[2]
if/else
。
在以下代码部分中可以看到问题:
...
else if ((max1 == max2 && max2 == max3 && max1 == max3) && x[i] < max2) {
max2 = x[i];
if (max2 < max3) {
max3 = max2;
}
} else if (max2 == max3 && x[i] < max3) {
max3 = x[i];
}
...
它不起作用有两个原因:
在第一个
max2
块中,max3
和if/else
都被更改,因此其他[5, 5, 5, 2
块将在以后的循环迭代中工作,但是问题在于,这假定将要进行下一个迭代。如果上面的代码块是循环中最后执行的事情,例如max1
]。(旁注)如果
max2
,max3
和x[i] < max2
都等于,并且max2
,则在该行之后:max2 = x[i];
max3
始终小于if (max2 < max3) {
,因此不需要测试max1 == max2 && max2 == max3 && max1 == max3
。测试
max2 == max3
和max1
不处理以下情况:max2
,max3
和[5, 5, 5, 2]
都相等,但每个表示数组中的不同元素,例如i = 3
,当for
循环中的max1
时,x[0]
可以代表max2
,x[1]
可以代表max3
,而x[2]
可以代表max2
,但是因为不跟踪唯一性,max3
和2
重新分配给for
,因为这是2, 2, 5
循环执行的最后一件事,所以输出为max2
。max3
和[7, 7, 8, 2]
相等,但每个代表数组中的不同元素,例如对于i = 3
,当for
循环中的max2
时,x[0]
代表max3
,而x[1]
代表max3
,但是又一次,因为不跟踪唯一性,所以将2
重新分配给,并且输出为2, 7, 8
而不是7, 7, 8
。要清楚:
如果您测试了数组
[5, 5, 5, 5, 2]
,其中2
出现在索引4
处,则由于上述原因,程序将输出2, 2, 5
。如果测试了数组
[5, 5, 5, 2, 5]
,其中2
出现在索引3
处,则程序将输出2, 5, 5
,因为在5
之后仅出现一个2
。如果测试了数组
[5, 5, 2, 5, 5]
,其中2
出现在索引2
处,则程序将输出5, 5, 5
,因为在5s
之后出现了两个2
。最后,max1
,max2
和max3
彼此相等,5
。如果您测试的数组
[5, 5, 2, 5, 5, 3]
只是前一个数组,但最后添加了3
,则程序将输出3, 3, 5
,因为在i = 5
循环中的for
,max1
,和max2
彼此相等,max3
,程序假定这是因为它们最初都设置为5
。现在您已经了解了该程序为何无法运行的问题,我认为解决此问题的更好方法是先使用
x[0]
包装器类将max1
,max2
和max3
初始化为尽可能低的值,阅读有关它here:更换
int max1 = x[0], max2 = x[0], max3 = x[0];
与
int max1, max2, max3;
max1 = max2 = max3 = Integer.MIN_VALUE;
然后将最后一个
Integer
循环更改为现在从索引for
而不是0
开始for (int i = 0; i < x.length; i++) {
并删除最后两个
1
块:else if ((max1 == max2 && max2 == max3 && max1 == max3) && x[i] < max2) {
max2 = x[i];
if (max2 < max3) {
max3 = max2;
}
} else if (max2 == max3 && x[i] < max3) {
max3 = x[i];
}
您已经非常接近解决它了,只需要进行一些小改动就可以修复错误。
希望这对您有所帮助,并为他们加油!
关于java - 用户提供的整数数组的第一,第二和第三大数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47721216/