2013-06-03 37 views
0

我需要一些數組的幫助我試圖創建一個簡單的程序,可以從數組中的最大數量得到最小數目的差異,但它看起來像我正在做的循環沒有達到目標。例如:int [] numbers = {2,5,7,32} ...輸出必須是「30」,因爲2是最小的,32是最大的數字,它們的差值是「30」。這是我的代碼。從最小的數字到最大的數字差異 - Java陣列

public static void main(String[] args) { 

    int[] value = {5,16,3,32}; 

    int diff = 0; 
    int highest = 0; 

    for (int i = 0; i<value.length; i++) 
    { 
     for(int y = 0;y<value.length;y++) 
     {    
      diff = value[i] - value[y]; 

      if(diff > highest){ 
       highest = diff; 

       System.out.println("the difference of the lowest and the highest is "+ diff); 
      }  
     } 
    } 

}}

請大家幫忙,我還在學習技巧之類的東西。謝謝:)

+0

你可以做到這一點只有一個循環,看到我的答案。 – fge

+0

嗨,你可以在一行沒有循環做到這一點,請看我的答案。 –

回答

3

需要記錄最小和最大值,然後計算差異;更重要的是,只需要一個循環:

public static void main(String[] args) { 

    int[] value = {5,16,3,32}; 
    // Guarantee sane initial min/max 
    int min = Integer.MAX_VALUE, max = Integer.MIN_VALUE; 


    for (final int val: value) { 
     if (val < min) 
      min = val; 
     if (val > max) 
      max = val; 
    } 

    System.out.println("diff is " + (max - min)); 
} 

的「絕招」在這裏(如果這可以稱爲一招)當然是minmax的初始值。

注意:這裏有溢出的風險。留作練習以避免它!

0

由於您只遍歷1維數組,因此不需要使用兩個循環。此外,如果您將println語句放入循環中,它將會多次打印,這是您想要的嗎?如果不把它放在最後。請嘗試以下操作:

int min=value[0]; 
int max=value[0]; 
int diff=0; 

for(int i=0; i < value.length; i++) 
{ 
    if(value[i]<min) 
     min=value[i]; 
    if(value[i]>max) 
     max=value[i]; 
} 
diff = max-min; 
System.out.println("The difference of the lowest and the highest is "+diff); 
+0

如果數組包含<=然後0 –

+0

這將不起作用因爲數組中沒有任何值小於零,所以'min'永遠不會被賦值。在循環結束時,'min'仍然是'0','max'是'32',所以在你的代碼中計算的差值是'32',這是不正確的。 – Vulcan

+0

@Bartek實際上,如果數組包含非正值,它將*只能*準確地工作。 – Vulcan

0

請參閱以下內容。我們可以在o(n)中做到這一點;

public static void main(String[] args) { 
int[] value = {5,16,3,32}; 
int lowest = 2147483647; 
int highest = 0; 
int diff = 0; 
for (int i = 0; i<value.length; i++) 
{ 
    if(value[i] < lowest){ 
    lowest = value[i]; 
    } 
    if(value[i] > highest){ 
    highest = value[i]; 
    } 
    } 
    diff = highest-lowest; 
    system.out.println("The difference is "+ diff); 
} 
+0

如果數組只有負值,這將輸出不正確的結果。 – Vulcan

1

試試這個,並注意以下事項:

  1. 你會想只在結束打印的最大區別「的」循環。這樣,你只會打印最大值。
  2. 如果您只是查看差異的絕對值並僅檢查每對元素(注意'j = i + 1'和'Math.abs(...)'行),則您可以執行較少的比較。 。
  3. 我把'y'改爲'j',因爲'i/j'在Java中更加慣用。

下面的代碼:

int[] value = {5,16,3,32,6}; 

    int diff = 0; 
    int highest = 0; 

    for (int i = 0; i < value.length; i++) 
    { 
     for(int j = i+1; j < value.length; j++) 
     {    
      diff = Math.abs(value[i] - value[j]); 

      if (diff > highest) { 
       highest = diff; 
      }  
     } 
    } 
    System.out.println("the difference of the lowest and the highest is "+ highest); 
+0

雖然這是兩個只需要一個循環的循環。 – fge

+0

當然,你可以遍歷數組並追蹤最小和最大元素。那也可以。但是這個解決方案反映了OP對問題的直覺。 –

-1

你可以有Arrays.sort容易排序的數組。然後第一個元素是最小的,最後最大:

int[] value= {5,16,3,32,6}; 
Arrays.sort(value); 
int min = value[0]; 
int max = value[value.length-1]; 
int dif = max-min; 
+0

其計算效率不高 它的O(n log n),最高效的是O(n)。除非使用隨機選擇算法,否則它可能在O(1)中工作。 –

+0

@Bartek效率低下,但是迄今爲止最簡單,最容易理解和維護。所以如果你知道你正在處理一個相對較小的桌子,那將是最好的選擇。 – nakosspy

0

你將不得不做這樣的事情,如果陣列不是已經排序:

  1. 從陣列中找到的最小和最大數量。
  2. 從最大值減去最小值。

如果數組進行排序:

  1. 減去0指數從array.length-1
1

可以使用lambdaj(website - download),該庫是爲收藏管理非常強大,以下代碼非常簡單並且完美:

import static ch.lambdaj.Lambda.*; 
public class Test { 

    public static void main(String[] args) { 
     Integer[] values = {5,16,2,32}; 

     int minValue = min(values, on(Integer.class)); 
     int maxValue = max(values, on(Integer.class)); 
     System.out.print("Rtn:" + (maxValue - minValue)); //Print 30 
    } 

} 

With thi你可以在一行中解決你的問題。你必須添加到你的項目lambdaj-2.4.jar希望這個幫助服務。