@Biaci_Anj

Java, эта задача решается только через множество if?

Мне надо убрать из массива все числа, которые больше соседних.
Например
5 3 8 1 превращается в 3 ( 5 больше 3 ) 1 ( 8 больше 3 и 1 ).
18, 1, 3, 6, 7, -5 превращается в 1, 3, 6, -5 и т.п.

Но столкнулся с такой трудностью, когда индекс > 0 и < array.length-1, то мы сравниваем предыдущее число и следующее с текущим.
Когда индекс 0 - только следующее
когда индекс array.length-1 - только предыдущее.

Выходит, большой if на три условия это единственный способ выполнить задачу?
Или есть более элегантный подход?

public static int[] removeMax(int[] array) {
        int[] localMax = new int[array.length];
        int s = -1;
        for (int i = 0; i < array.length; i++) {

            if ((i == 0 && array[i] > array[i + 1]) ||
                    (i != 0 && i != array.length - 1 && array[i] > array[i + 1] && array[i] > array[i - 1]) ||
                    (i == array.length-1 && array[i-1] < array[i])) {
                continue;
            }
            localMax[++s] = array[i];
        }
        return Arrays.copyOf(localMax, s+1);
    }

Вот пример моего ифа, может, я что-то неправильно понимаю и есть более простой способ.
  • Вопрос задан
  • 120 просмотров
Решения вопроса 2
sergey-gornostaev
@sergey-gornostaev Куратор тега Java
Седой и строгий
for (int i = 0; i < array.length; i++) {
    double previous = i == 0 ? Double.POSITIVE_INFINITY : array[i - 1];
    double next = i < array.length ? array[i + 1] : Double.POSITIVE_INFINITY;
    int current = array[i];

    if (current > previous || current > next)
        continue;

    localMax[++s] = current;
}
Ответ написан
Комментировать
LaRN
@LaRN
Senior Developer
Если не хочется заморачиваться на проверку границ массива можно дважды пройтись по массиву, вначале слева-направо затем наоборот.
Первый проход от 0 элемента до array.length - 2
включительно.
Вот так:
5 3 8 1
array[i] = min([array[i], array[i+1])
На выходе получим
5-3 - > 3
3-5 - > 3
8-1 - > 1
Второй проход от array.length - 3 до 1 включительно.
array[i] = min([array[i], array[i+1])
На выходе получим
3-1 - > 1
И на 0 индексе уже стоит число 3 его не трогаем.
В итоге в выходной массиве в диапазоне индексов [0;array.length - 3] будет находиться ответ.
В нашем примере ответ это подмассив [0;1]
И там должно быть 3 1
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы