Замена элементов в массиве большим соседом - PullRequest
0 голосов
/ 12 октября 2018

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

Я выполнил код, но у меня есть одна проблема: последний элемент заменяется, хотя он и был заменен.не должно.Было бы очень хорошо, если бы вы могли взглянуть на мой код.

public static void replaceWithNeighbours(int[] array) {
        for (int i = 1; i < array.length - 1; i++) {
            int larger = array[i - 1];

            if (larger < array[i + 1]) {
                larger = array[i + 1];
            }

            array[i] = larger;
        }
    }

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Это можно сделать простым способом:

public int[] replaceWithNeighbours(int[] arr) {
    int[] ret = new int[arr.length];
    for (int i = 0; i < arr.length; ++i) {
        if (i == 0 || i == arr.length - 1) {
            ret[i] = arr[i];
        } else {
            ret[i] = Math.max(arr[i-1], arr[i+1]);
        }
    }
    return ret;
}

Краткое объяснение: сначала мы создадим новый массив ret, который будет содержать желаемый результат и установит его в той же длине, что и исходный массив.Затем мы перебираем содержимое исходного массива.Если мы имеем дело с первым или последним элементом, мы просто копируем их в ret.Если мы имеем дело с другими элементами, мы используем Java Math.max метод, чтобы определить максимальное значение из 2 соседей и установить i-й элемент в ret на это значение.

0 голосов
/ 12 октября 2018

Наивное решение, управление массивом может быть сделано лучше, однако это работает.

public static void replaceWithNeighbours(int[] array, int[] out) throws Exception
{
    // checkif lengths match
    if (array.length != out.length)
    {
        throw new Exception("Lengths don't match");
    }

    // replace values in output array
    out[0] = array[0];
    out[out.length - 1] = array[array.length - 1];
    for (int i = 1; i < array.length - 1; i++) {

        int larger = array[i - 1];

        if (larger < array[i + 1]) {
            larger = array[i + 1];
        }

        out[i] = larger;
    }
}

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

Поскольку у вас также есть проблема с последним обновляемым элементом:

Просмотрите свой код, используя отладчик или простые операторы печати, и выясните, где именно ваш индекс 9 действительно доступен.Это не в replaceWithNeighbours, поэтому должно быть где-то еще.Однако вы можете решить эту проблему самостоятельно, просто посмотрите, какие индексы используются, а когда увидите цифру 9, посмотрите, что и где введено.

...