gpt4 book ai didi

java - 用户提供的整数数组的第一,第二和第三大数

转载 作者:行者123 更新时间:2023-12-02 02:26:22 25 4
gpt4 key购买 nike

在此程序中,数组和数组元素的大小取自用户。

这段代码通过了我尝试过但无法通过的所有情况,其中数组的大小为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,它不知道max3max2max1分别代表ints5x[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块中, max3if/else都被更改,因此其他 [5, 5, 5, 2块将在以后的循环迭代中工作,但是问题在于,这假定将要进行下一个迭代。如果上面的代码块是循环中最后执行的事情,例如 max1]。


(旁注)如果 max2max3x[i] < max2都等于,并且 max2,则在该行之后:

max2 = x[i]; 


max3始终小于 if (max2 < max3) {,因此不需要测试 max1 == max2 && max2 == max3 && max1 == max3

测试 max2 == max3max1不处理以下情况:


max2max3[5, 5, 5, 2]都相等,但每个表示数组中的不同元素,例如 i = 3,当 for循环中的 max1时, x[0]可以代表 max2x[1]可以代表 max3,而 x[2]可以代表 max2,但是因为不跟踪唯一性, max32重新分配给 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。最后, max1max2max3彼此相等, 5
如果您测试的数组 [5, 5, 2, 5, 5, 3]只是前一个数组,但最后添加了 3,则程序将输出 3, 3, 5,因为在 i = 5循环中的 formax1max2彼此相等, max3,程序假定这是因为它们最初都设置为 5


现在您已经了解了该程序为何无法运行的问题,我认为解决此问题的更好方法是先使用 x[0]包装器类将 max1max2max3初始化为尽可能低的值,阅读有关它 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com