2015-11-21 92 views
3

最近我已經分配了一個任務,要求我「計算傳遞給它的數組中兩個相鄰數字之間的最大差異」。我對Java相當陌生(過去我只做過VB),由於這個主題沒有很好地向我解釋,所以我不太清楚如何去做。計算數組中兩個相鄰數字之間的最大差異

這裏是關於任務本身的一些附加信息:

功能必須通過下面的測試。函數maxDiff應計算數組中傳遞給它的兩個相鄰數字之間的最大差異。

@Test 
public void assessmentTest() { 
int [] numbers = {12, 8, 34, 10, 59}; 
assertEquals(49, maxDiff(numbers)); 
int [] numbers2 = {-50, 100, 20, -40}; 
assertEquals(150, maxDiff(numbers2)); 
} 
+1

那麼,邏輯和VB一樣。你用循環遍歷數組計算差異並保持最大值。您可以使用['Math.abs()'](http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#abs(int))來獲得結果的絕對值你的減法。 –

+2

這是功課嗎?如果是這樣,可以在這裏提問,但值得一提的是,這樣的回答可以解釋所涉及的概念。 – halfer

回答

2

你必須保證採取絕對差異,不要忘記它。這就是我使用Math.abs()函數的原因。

public static int maxDiff(int[] numbers) { 
     int diff = Math.abs(numbers[1] - numbers[0]); 
     for(int i = 1; i < numbers.length-1; i++) 
      if(Math.abs(numbers[i+1]-numbers[i]) > diff) 
       diff = Math.abs(numbers[i+1] - numbers[i]); 
     return diff; 
} 
+0

如果列表少於兩個元素,這將引發異常。 – Proghero

+0

你是對的,除了一個小錯字。如果你在for循環中做「i

+0

不,我不會錯過最後一個。我不知道你是否意識到我減去[i + 1] - [i]。我不能去,直到最後一個索引,所以我會得到一個「索引越界」異常。這就是爲什麼我要走到最後一個之前。得到它了? – Paulo

2

像這樣的東西應該做的伎倆:

public static int maxDiff(int[] numbers) { 
     if (numbers.length < 2) { 
      return 0; 
     } 
     if (numbers.length == 2) { 
      return Math.abs(numbers[1] - numbers[0]); 
     } 
     int max = Math.abs(numbers[1] - numbers[0]); 
     for (int i = 2; i < numbers.length; i++) { 
      int diff = Math.abs(numbers[i-1] - numbers[i]); 
      if (diff > max) { 
       max = diff; 
      } 
     } 
     return max; 
} 
+0

此答案處理列表爲空或只有1個元素的情況。運行時間是O(n)。 – Proghero

2

對於你問的具體問題:

public static int maxDiff(int[] arr) { 
    if(arr.length < 2) 
     return -1; // error condition: throw exception? 

    int maxdiff = Integer.MIN_VALUE; 
    for(int i = 1; i < arr.length; ++i) { 
     int diff = Math.abs(arr[i] - arr[i-1]); 
     if(diff > maxdiff) 
      maxdiff = diff; 
    } 

    return maxdiff; 
} 

如果你想在陣列中的所有數字的最大差異(不只是相鄰的),最有效的方法是迭代數組以找到最小值和最大值,然後返回兩個值的絕對值。

public static int maxDiff(int[] arr) { 
    if(arr.length < 2) 
     return -1; // error condition: throw exception? 

    int min = Integer.MAX_VALUE; 
    int max = Integer.MIN_VALUE; 
    for(int i = 0; i < arr.length; ++i) { 
     if(arr[i] < min) 
      min = arr[i]; 
     if(arr[i] > max) 
      max = arr[i]; 
    } 

    return Math.abs(max - min); 
} 
2

這段代碼可以幫助你:

int[] numbers = {12, 8, 34, 10, 59}; 

    int diff = 0; 
    int previous = 0; 

    for (int n : numbers) { 
     diff = Math.max(diff, Math.abs(n - previous)); 
     previous = n; 
    } 

變量「差異」將包含您要查找的值。

相關問題