2015-11-21 52 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; 
    } 

变量“差异”将包含您要查找的值。

相关问题