![](/img/trans.png)
[英]largest and second largest number getting same value from integer array in java?
[英]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
時,它不知道max3
, max2
和max1
分別代表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];
}
...
它不起作用有兩個原因:
在第一個if/else
塊中, max2
和max3
都被更改,因此其他if/else
塊將在以后的循環迭代中工作,但是問題在於, 這假設將要進行下一個迭代 。 如果上面的代碼塊是循環中最后執行的內容,例如[5, 5, 5, 2
5、5、5、2],則此功能不起作用。
(旁注)如果max1
, max2
和max3
都相等,並且x[i] < max2
,則在該行之后:
max2 = x[i];
max2
始終小於max3
因此max3
測試if (max2 < max3) {
。
測試max1 == max2 && max2 == max3 && max1 == max3
和max2 == max3
無法處理以下情況:
max1
, max2
和max3
都相等,但是每個代表數組中的一個不同元素,例如[5, 5, 5, 2]
max3
[5, 5, 5, 2]
,如果在for
循環中i = 3
,則max1
可以表示x[0]
, max2
可以表示x[1]
和max3
可以表示x[2]
但因為不重復沒有保持軌道,的max2
和max3
被重新分配給2
並且由於這是最后的事for
循環執行,則輸出為2, 2, 5
。
max2
和max3
相等,但每個代表數組中的不同元素,例如[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
的因的原因如上所述。 [5, 5, 5, 2, 5]
,其中2
出現在索引3
,則程序將輸出2, 5, 5
因為在2
之后僅出現5
。 [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
因為當for
i = 5
時環, max1
, max2
,和max3
所有彼此相等, 5
,程序假定這是因為它們是所有初始設定為x[0]
現在你明白為什么程序無法正常工作,我認為更好的方法來解決這個問題的方法是首先初始化max1
, max2
和max3
使用可能的最低值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.