在此程序中,数组和数组元素的大小取自用户。
此代码传递了我尝试但无法通过的所有情况,其中数组的大小为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");
}
}
}
答案 0 :(得分:1)
这段代码不是人类可读的,你会在这几个小时试图调试。 首先,您需要将此代码拆分为方法,而不是尝试在一个方法中执行所有操作。您需要将接收int数组的逻辑从用户与执行最大值计算的逻辑分离。示例:
public int[] threeMaximumValuesFrom(int[] array) {
int[] sorted = sortArray(array);
int[] result = {
sorted[array.length - 1];
sorted[array.length - 2];
sorted[array.length - 3];
}
return result;
}
private int[] sortArray(int[] array) {
//when you don't want to use jdk sort implement your own
//in any way other parts of code should knows nothing about it
Arrays.sort(array);
return array;
}
答案 1 :(得分:1)
问题是数组中重复的整数不会跟踪为唯一元素。
当您在纸上查看数组x = [5, 5, 5, 2]
时,您会发现有三个唯一 int
元素值为5
,因此最大的三个元素应为5, 5, 5
但是现在的测试方式是,当它达到数组末尾的值2
时,它不知道max3
,max2
, max1
和ints
分别代表5
,x[0]
和x[1]
的三个不同 x[2]
值...
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];
}
...
。
这个问题可以在这个代码部分看到:
if/else
它有两个原因无效:
在第一个max2
块中,max3
和if/else
都已更改,因此其他[5, 5, 5, 2
块将在 future 期间生效循环迭代,但问题是这假定会有下一次迭代。当上面的代码块是循环中执行的 last 事物时,它不起作用,例如max1
]。
(旁注)如果max2
,max3
和x[i] < max2
都相等,那么max2 = x[i];
,那么line:
max2
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]
1}}可以代表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
,程序假定这是因为它们最初都设置为{ {1}}。现在您已了解该程序无效的原因,我相信解决此问题的更好方法是首先将max2
,max3
和Integer
初始化为尽可能低的使用int max1 = x[0], max2 = x[0], max3 = x[0];
包装器类的值,阅读它here:
替换
int max1, max2, max3;
max1 = max2 = max3 = Integer.MIN_VALUE;
与
for
然后将最后一个0
循环更改为从索引1
开始,而不是for (int i = 0; i < x.length; i++) {
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];
}
块:
{{1}}
你非常接近解决它,只需要进行一些小的修改来修复bug。
希望这有用,欢呼!
答案 2 :(得分:0)
int[] numbers = {5, 5, 5, 2};
Arrays.stream(numbers).sorted().skip(numbers.length - 3).forEach(System.out::println);
我们从你的数组中生成流,然后我们对它进行排序,我们跳过arrayLength - n个元素(n代表你想打印出多少个最大数字),然后我们打印剩下的每个数字。