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

这段代码通过了我尝试过但无法通过的所有情况,其中数组的大小为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循环中的formax1,和max2彼此相等,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/

10-10 09:41