#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:
Я вижу две проблемы:
-
if there are several such segments, return the RIGHT
— это означает, что вы должны заменить предыдущую самую длинную последовательность на текущую, даже если они имеют одинаковую длину. т.е.if (currentSequenceLength > sequenceLength)
должно бытьif (currentSequenceLength >= sequenceLength)
. -
Вы игнорируете любую последовательность, которая заканчивается на последнем индексе массива. Вы должны обработать это после цикла, добавив:
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<
}