来自用户提供的整数数组

时间:2017-12-08 19:47:43

标签: java arrays

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

此代码传递了我尝试但无法通过的所有情况,其中数组的大小为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");      
            }       
        }
    }

3 个答案:

答案 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时,它不知道max3max2max1ints分别代表5x[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

它有两个原因无效:

  1. 在第一个max2块中,max3if/else都已更改,因此其他[5, 5, 5, 2块将在 future 期间生效循环迭代,但问题是这假定会有下一次迭代。当上面的代码块是循环中执行的 last 事物时,它不起作用,例如max1]。

    • (旁注)如果max2max3x[i] < max2都相等,那么max2 = x[i]; ,那么line:

      max2

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

  2. 测试max2 == max3max1无法处理以下情况:

    • max2max3[5, 5, 5, 2]都相同,但每个代表数组中的不同元素,例如i = 3,当for循环中的max1然后x[0]代表max2时,x[1]代表max3x[2] 1}}可以代表max2,但由于未跟踪唯有身份,max32会重新分配给for,因为这是2, 2, 5的最后一件事}循环执行,输出为max2

    • max3[7, 7, 8, 2]相等但每个代表数组中的不同元素,例如对于i = 3,当for循环中的max2时,x[0]代表max3x[1]代表max3但是,因为独特未跟踪,2被重新分配到2, 7, 8,输出为7, 7, 8而不是[5, 5, 5, 5, 2]

  3. 要明确:

    • 如果您测试了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。最后:max35[5, 5, 2, 5, 5, 3]彼此相等,3
    • 如果您测试的数组3, 3, 5只是前一个数组但最后添加了i = 5,那么程序会输出for,因为当max1max2循环,max35x[0]彼此相等,max1,程序假定这是因为它们最初都设置为{ {1}}。

    现在您已了解该程序无效的原因,我相信解决此问题的更好方法是首先将max2max3Integer初始化为尽可能低的使用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代表你想打印出多少个最大数字),然后我们打印剩下的每个数字。