数组-求和元素的邻居?

时间:2019-03-23 06:53:34

标签: java arrays for-loop

该问题要求编写静态方法sumNeighbours,该方法将整数数组作为参数,并返回与原始数组具有相同元素数的数组,以使新数组中的每个整数都是其邻居及其自身的和在原始数组中。

例如

[10, 20, 30, 40]

将是

[30, 60, 90, 70]
30(10+20) 60(20+10+30) 90(30+20+40) 70(40+30)

谢谢。这是我已经完成的代码,并且可以正常工作,但仅适用于某些情况,而不适用于所有情况。谁能推荐一种更有效的方法来解决这个问题?在某些情况下,无需对所有if和else进行硬编码。

public static int[] sumNeighbours(int[] values) {
int[] list = new int[values.length];
for (int i=0; i<values.length; i++) {
    if (values.length > 1) {
        if (values[i] == values[0]) {
            list[i] = values[i] + values[i+1];
        }
        else if (values[i] == values[values.length-1]) {
            list[i] = values[i] + values[i-1];
        }
        else {
            list[i] = values[i] + values[i-1] + values[i+1];
        }
    }
    else {
        list [i] = values[i];
    }
}
return list;
}   

5 个答案:

答案 0 :(得分:0)

首先:您的输入内容可能为null,因此请先进行null检查,然后在这种情况下我想返回null。

第二:在创建相同大小的数组之后,您需要迭代输入,并对每个索引检查两件事:

  1. 如果索引小于(length-1),请在右侧添加元素
  2. 如果索引大于0,则在左侧添加元素
  3. 总是在当前索引中添加元素

完成了吗?

答案 1 :(得分:0)

不要使用值来检查元素是否为首末尾,使用索引以及是否进行nullptr检查。对于诸如[30,30,30]

这样的情况,您的代码将失败
    public static int[] sumNeighbours(int[] values) {
        if (null == values)
            return null;
        int[] list = new int[values.length];
        for (int i=0; i<values.length; i++) {
            if (values.length > 1) {
                if (i == 0) {
                    list[i] = values[i] + values[i+1];
                }
                else if (i == values.length-1) {
                    list[i] = values[i] + values[i-1];
                }
                else {
                    list[i] = values[i] + values[i-1] + values[i+1];
                }
            }
            else {
                list [i] = values[i];
            }
        }
        return list;

    }

答案 2 :(得分:0)

  

这是我已经完成的代码,并且可以正常工作,但仅适用于某些情况,并非全部

可能是因为您比较值而不是索引:if (values[i] == values[0])必须为if (i == 0),而if (values[i] == values[values.length-1])必须为if (i == values.length - 1)

具有较少代码和空检查的代码段可能如下所示

public static int[] sumNeighbours(int[] input) {
    if (input == null) {
        return null;
    }

    int[] result = new int[input.length];
    for (int i = 0; i < input.length; i++) {
        int sum = input[i];

        if (i > 0) {
            sum += input[i - 1];
        }
        if (i < (input.length - 1)) {
            sum += input[i + 1];
        }

        result[i] = sum;
    }

    return result;
}

答案 3 :(得分:0)

如果在循环中删除if块,则可以提高效率:

public static int[] sumNeighbours(final int[] values) {

    if (null == values || 2 > values.length) {
        return values;
    }

    final int len = values.length;
    final int[] list = new int[len];

    list[0] = values[0] + values[1];
    list[len - 1] = values[len - 2] + values[len - 1];

    for (int i = 1; i < len - 2; i++) {
        list[i] = values[i - 1] + values[i] + values[i + 1];
    }

    return list;
}

您不需要在边缘添加3个数字。

答案 4 :(得分:0)

签出,

public static int[] sumNeighbours(int[] values) {
int[] list = new int[(values.length)];
for (int i=0; i<values.length; i++) {
 if (values.length > 1) { //To Check if there are more than one values
    if(i==0) //It will check if it is first element
    {
        list[i]=values[i]+values[i+1]; //Add First value and second value to place it in first location. As first location has only one Neighbor 

    }
    else if (i==(values.length-1)) //TO check If its last value
    {
        list[i]=values[i]+values[i-1]; //As Last Location has only one Neighbor
    }
    else
    {
         list[i]=values[i]+values[i-1]+values[i+1]; //For All intermediate locations
  }
}
}
return list;
}