Как вернуть наиболее правильное положительное сокращение массива nums?

#java #arrays

#java #массивы

Вопрос:

Моя задача: входные данные представляют собой одномерный массив. Необходимо найти диапазон максимальной ширины, элементы которого положительны (больше 0). В качестве ответа должен быть массив из 2 элементов, где: — Номер элемента 0 — элемент индекса левой границы сегмента; — Элемент №1 — индекс элемента правой границы сегмента.

Если таких сегментов несколько, верните ПРАВЫЙ. Если в массиве нет такого сегмента (все числа отрицательные), верните пустой массив. Я не понимаю, что я делаю не так. Вот мой код:

 public class ArrayUtils {
public static int[] lookFor(int[] array) {
    int[] result = new int[2];
    int firstIndex = 0;
    int lastIndex = 0;
    int sequenceLength = 0;
    int currentSequenceLength = 0;

    for (int i = 0; i < array.length; i  ) {
        if (array[i] > 0) {
            if ( currentSequenceLength == 0 ) {
                firstIndex = i;
            }

            currentSequenceLength  = 1;
            lastIndex = i;
        } else {
    if (currentSequenceLength > sequenceLength) {
        sequenceLength = currentSequenceLength;
        result[0] = firstIndex;
        result[1] = lastIndex;
    }
            currentSequenceLength = 0;
        }
    }


    if (sequenceLength == 0) {
        return new int[0];
    }

    return resu<
}
  

}

Комментарии:

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

2. Что вы имеете в виду, говоря «правильное отступление кода»?

3. Посмотрите на код в ответе Эрана: каждый раз, когда блок открывается с помощью { , тело блока записывается на 4 пробела справа. Это называется отступом. Не смотрите на свой код: объявление метода находится на том же уровне, что и определение класса, блок if, содержащийся внутри блока else, который сам находится внутри блока for, находится на том же уровне, что и его прародитель for блок. Это делает ваш код очень трудным для чтения, потому что структура неверна.

Ответ №1:

Я вижу две проблемы:

  1. if there are several such segments, return the RIGHT — это означает, что вы должны заменить предыдущую самую длинную последовательность на текущую, даже если они имеют одинаковую длину. т.е. if (currentSequenceLength > sequenceLength) должно быть if (currentSequenceLength >= sequenceLength) .

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

     if (currentSequenceLength >= sequenceLength) {
        sequenceLength = currentSequenceLength;
        result[0] = firstIndex;
        result[1] = lastIndex;
    }
      

Подводя итог, ваш метод должен выглядеть следующим образом:

 public static int[] lookFor(int[] array) {
    int[] result = new int[2];
    int firstIndex = 0;
    int lastIndex = 0;
    int sequenceLength = 0;
    int currentSequenceLength = 0;

    for (int i = 0; i < array.length; i  ) {
        if (array[i] > 0) {
            if ( currentSequenceLength == 0 ) {
                firstIndex = i;
            }

            currentSequenceLength  = 1;
            lastIndex = i;
        } else {
            if (currentSequenceLength >= sequenceLength) {
                sequenceLength = currentSequenceLength;
                result[0] = firstIndex;
                result[1] = lastIndex;
            }
            currentSequenceLength = 0;
        }
    }
    if (currentSequenceLength >= sequenceLength) {
        sequenceLength = currentSequenceLength;
        result[0] = firstIndex;
        result[1] = lastIndex;
    }


    if (sequenceLength == 0) {
        return new int[0];
    }

    return resu<
}