【问题标题】:Difference between elements in one array in JavaJava中一个数组中元素之间的差异
【发布时间】:2015-11-01 17:52:39
【问题描述】:

我正在学习 Java,并尝试为我的作业构建一种方法。它将Array 作为参数并返回其元素之间的差异(作为绝对值)。

例如:数组{7,8,5,7,2}

元素 0 和 1 的差为 1 (=7−8)

元素 1 和 2 的差为 3 (=8−5)

元素 2 和 3 的差是 2 (=5-7)

元素 3 和 4 的差是 5 (=7−2)

元素 4 和 0 的差是 5 (=2-7)

如果有多个候选者,该方法将返回具有最大索引的那个。在这个例子中,最后一个。如果array 为空,则该方法必须返回−1

我的代码中有一些问题(如您所见),最大的问题是我的方法只返回最后一个 diff 而不是索引较高的最大的。有人能帮我吗?我不知道如何解决这个问题。

public static int MaxDiff(int[] array){

        int diff = 0;

        if (array.length == 0){   // Checks for empty array
            return -1;
        }

        for (int i = 0; i <= array.length; ++i){

            if(i == array.length){
                diff = Math.abs(array[i] - array[0]);
            } else {
                diff = Math.abs(array[i] - array[i+1]); // Mistake. Can be
                                                        // bigger than array
            }
        }

        return diff;
    } 

【问题讨论】:

  • 你显示的代码会给你ArrayIndexOutOfBoundException
  • 另外:不要在循环内使用if 来检查它是否是最后一次迭代。只需在循环之后添加代码即可。

标签: java arrays methods


【解决方案1】:

我做了一点改动,然后你的代码就可以正常工作了。

public static int MaxDiff(int[] array){

    int diff = 0;

    if (array.length == 0){ 
        return -1;
    }

    int max = 0;
    for (int i = 0; i < array.length-1; ++i){

        diff = Math.abs(array[i] - array[i+1]);
        if(max < diff)
            max = diff;
    }

    return max;
} 

【讨论】:

    【解决方案2】:

    创建一个实例变量 maxDiff 并在循环中发现 diff 大于当前计算 diff 时更新。喜欢

    maxDiff = diff > maxDiff ? diff : maxDiff;
    

    最后返回maxDiff;

    public static int MaxDiff(int[] array){
    
             //create a variable to hold maxDiff;
            int maxDiff = 0;
            int diff = 0;
    
            if (array.length == 0){   // Checks for empty array
                return -1;
            }
    
            //Change from <= to < (otherwise you will get ArrayIndexOutOfBound exception
            for (int i = 0; i < array.length; ++i){
    
                if(i == array.length -1){
                    diff = Math.abs(array[i] - array[0]);
                } else {
                    diff = Math.abs(array[i] - array[i+1]); // Mistake. Can be
                                                            // bigger than array
                }
                //check for max
                maxDiff = diff > maxDiff ? diff : maxDiff;
            }
    
            return maxDiff;
        }
    

    【讨论】:

    • i 永远不会是 ==array.length
    • 是的。我刚刚更新了程序的主要部分。谢谢。
    【解决方案3】:

    只有当 diff 比现在大时,你才需要设置它。

    int newDiff;
    if(i == array.length - 1){
        newDiff = Math.abs(array[i] - array[0]);
    } else {
        newDiff = Math.abs(array[i] - array[i+1]);
    }
    if(newDiff > diff)
        diff = newDiff;
    

    正如@singhakash 所说,大小为n 的数组的最后一个元素的索引是n - 1,而不是n

    【讨论】: