Массивы - суммирование соседей элементов? - PullRequest
0 голосов
/ 23 марта 2019

В вопросе предлагается написать статический метод sumNeighbours, который принимает массив целых чисел в качестве аргумента и возвращает массив с тем же числом элементов, что и исходный массив, так что каждое целое число в новом массиве является суммой его соседей и самого себя. в исходном массиве.

например.

[10, 20, 30, 40]

будет

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

Спасибо. Вот код, который я сделал, и он работает, НО только для НЕКОТОРЫХ случаев, а не ВСЕХ. Кто-нибудь может порекомендовать более эффективный способ подойти к этому? Без жесткого кодирования всех тех, если и для некоторых случаев.

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 голосов
/ 23 марта 2019

Проверьте это,

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;
}
0 голосов
/ 23 марта 2019

Более эффективный способ, если вы удалите блоки 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 числа по краям.

0 голосов
/ 23 марта 2019

Не используйте значения, чтобы проверить, является ли элемент первым или последним, используйте индексы, а также проверьте 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;

    }
0 голосов
/ 23 марта 2019

Вот код, который я сделал, и он работает, НО только для НЕКОТОРЫХ случаев, а не ВСЕ

Вероятно, это потому, что вы сравниваете значения, а не индексы: 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;
}
0 голосов
/ 23 марта 2019

Во-первых: ваш ввод может быть нулевым, поэтому сначала проверьте нулевое значение, и, я думаю, в этом случае верните нулевое значение.

Второе: после создания массива одинакового размера необходимо выполнить итерацию ввода и для каждого индекса проверить две вещи:

  1. Если индекс меньше (длина-1), добавьте элемент справа
  2. Если индекс больше 0, добавить элемент слева
  3. Всегда добавлять элемент в текущий индекс

Готово

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...