簡體   English   中英

用戶提供的整數數組的第一,第二和第三大數

[英]First, Second and Third largest number from user provided integer array

在此程序中,數組和數組元素的大小取自用戶。

這段代碼通過了我嘗試過但無法通過的所有情況,其中數組的大小為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");      
            }       
        }
    }

該代碼不是人類可讀的代碼,您將在其中嘗試調試幾個小時。 首先,您需要將此代碼拆分為方法,不要嘗試在一個方法中做所有事情。 您需要從進行最大值計算的邏輯中分離出從用戶接收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;
}

問題在於數組中重復的整數不能作為唯一元素來跟蹤。

當您在紙上查看數組x = [5, 5, 5, 2] ,可以看到存在三個唯一的 int元素,它們的值均為5所以三個最大的int元素應為5, 5, 5但是現在的測試方式,當它在數組末尾達到值2時,它不知道max3max2max1分別代表x[0]x[1]x[2]三個不同的 ints ,值5

在以下代碼部分中可以看到問題:

...

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. 在第一個if/else塊中, max2max3都被更改,因此其他if/else塊將在以后的循環迭代中工作,但是問題在於, 這假設將要進行下一個迭代 如果上面的代碼塊是循環中最后執行的內容,例如[5, 5, 5, 2 5、5、5、2],則此功能不起作用。

    • (旁注)如果max1max2max3都相等,並且x[i] < max2 ,則在該行之后:

       max2 = x[i]; 

      max2始終小於max3因此max3測試if (max2 < max3) {

  2. 測試max1 == max2 && max2 == max3 && max1 == max3max2 == max3無法處理以下情況:

    • max1max2max3都相等,但是每個代表數組中的一個不同元素,例如[5, 5, 5, 2] max3 [5, 5, 5, 2] ,如果在for循環中i = 3 ,則max1可以表示x[0]max2可以表示x[1]max3可以表示x[2]但因為不重復沒有保持軌道,的max2max3被重新分配給2並且由於這是最后的事for循環執行,則輸出為2, 2, 5

    • max2max3相等,但每個代表數組中的不同元素,例如[7, 7, 8, 2] max3 [7, 7, 8, 2] ,當for循環中i = 3時, max2代表x[0]max3代表x[1]但是再次,因為唯一身份沒有保持軌道, max3重新分配到2 ,輸出為2, 7, 8 ,而不是7, 7, 8

要清楚:

  • 如果所測試的陣列[5, 5, 5, 5, 2]其中2發生在索引4 ,該方案將輸出2, 2, 5的因的原因如上所述。
  • 如果測試數組2 [5, 5, 5, 2, 5] ,其中2出現在索引3 ,則程序將輸出2, 5, 5因為在2之后僅出現5
  • 如果所測試的陣列[5, 5, 2, 5, 5]其中2發生在索引2 ,該方案將輸出5, 5, 5因為有兩個5s在之后發生的2 最后: max1max2max3彼此相等, 5
  • 如果您測試的數組[5, 5, 2, 5, 5, 3]只是前一個數組,但最后添加了3 ,則程序將輸出3, 3, 5因為當for i = 5時環, max1max2 ,和max3所有彼此相等, 5 ,程序假定這是因為它們是所有初始設定為x[0]

現在你明白為什么程序無法正常工作,我認為更好的方法來解決這個問題的方法是首先初始化max1max2max3使用可能的最低值Integer包裝類,了解它在這里

更換

int max1 = x[0], max2 = x[0], max3 = x[0];

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];
}

您已經非常接近解決它了,只需要進行一些小的更改就可以修復錯誤。

希望這會有所幫助,並為之加油!

int[] numbers = {5, 5, 5, 2};
Arrays.stream(numbers).sorted().skip(numbers.length - 3).forEach(System.out::println);

我們從數組中取出流,然后對其進行排序,跳過arrayLength-n個元素(n表示要打印的最大數量),然后打印剩下的每個數字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM