2010-11-04 2 views
2

Я пытаюсь найти самую длинную последовательность убывающих чисел в массиве. Я не уверен, что я делаю неправильно в следующем коде.Найти самую длинную убывающую последовательность

public static int getDecSeq(double[] data) { 
    int currentSeq = 1; 
    int currentIndex = 1; 

    int longestSeq = 0; 
    int longestIndex = 0; 
    for (int i = currentIndex; i < data.length; i++) { 
    if (data[i] < data[i - 1]) { 
     currentSeq++; 
    } else { 
     currentSeq = 1; 
     currentIndex = i; 
    } 
    if (currentSeq > longestSeq) { 
     longestSeq = currentSeq; 
     longestIndex = currentIndex; 
    } 
    //double[] sequence = new double[longestSeq]; 
    //for (int j = longestIndex; j < longestSeq; j++) { 
     //sequence[j] 
    //} 
    } 
    return longestSeq; 
}//close getDecSeq 

Похоже, что настоящая проблема заключается в том, как правильно настроить данные, чтобы я мог использовать их в методе.

getData (input) возвращает кучу чисел из файла и сохраняет их в массиве.

я писал:

double[] data = getData(input); 
System.out.println("longest sequence is" + getDecSeq(data)); 

Я делаю это неправильно. Мои методы работают. Когда я объявлял переменные данные как:

double[] data = {119.1, 186.4, 46.3, 89.0 ...}; 

Все работало нормально. Итак, как переписать способ, которым я называю данные работать?

GetData является

public static double[] getData(Scanner input) { 
    double[] list = new double[70]; //Construct an array, length 70, to hold values from file 
    int count = 0; 
    while (input.hasNextDouble()) { 
     double n = input.nextDouble(); 
     list[count] = n; 
     count++; 
    } 
    double[] newList = new double[count]; 
    for (int i = 0; i < newList.length; i++) { 
     newList[i] = list[i]; 

    } 
    return newList; 
}//close getData 
+6

В чем проблема?Пожалуйста, дайте пример, для которого ваш алгоритм не работает ... –

+0

См. Также: http://stackoverflow.com/questions/3878105/finding-the-longest-down-sequence-in-a-java-array (но дон 't copy!) –

+1

Что это за 'getData'? Отправьте код этой функции. –

ответ

1

Это выглядит поразительно, как и мой псевдокод here. Один краевой случай, который вы не рассмотрели, - это то, что нужно вернуть, если цикл никогда не запускается. Я рассматривал бы их как особые случаи.

например.

if (data.length < 2) return data.length; 
+0

Действительно, очень похоже! –

3

ли 4444444 считается уменьшается? Если нет, то вы хотите проверить строго <, а не <=.

Не могли бы вы предоставить немного больше, например, когда ваш ответ не удался?

+0

Я думаю, это может быть то, что Роберт может искать. –

+0

Спасибо, что поймали это. Я забыл избавиться от =, но это все еще не помогает. – Robert

+0

@Robert Пожалуйста, пожалуйста, приведи пример! –

0

Посмотрите, когда вы назначаете longestSeq и longestIndex. Это поможет, если вы сначала нарисуете на бумаге то, что вы намерены использовать для данного тестового ввода, а затем запустите алгоритм во время просмотра (печати) значений Seq и Index на каждой итерации.

1

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

int currentSeq = 1; 
int currentIndex = 0; 

int longestSeq = 0; 
int longestIndex = 0; 
for (int i = 1; i < data.length; i++) { 
... 
+0

Возможно, проблема действительно, но поскольку выход является «longestSeq», код должен работать в любом случае ... –

+0

Если текущий индекс начинается с 0, на первой проверке будет выведено «ArrayOutOfBoundsException». Обратите внимание на 'data [i - 1]' –

+0

, но я начинаю с 1. – user434507

0

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

public int getDecSeq(double[] data) 
{ 

    int curSequence = 1; 
    int maxSequence = 1; 

    for (int i = 1; i <= data.Length - 1; i++) { 
     if (data[i] > data[i - 1]) { 
      if (curSequence > maxSequence) { 
       maxSequence = curSequence; 
      } 

      curSequence = 1; 
     } else { 
      curSequence += 1; 
     } 
    } 

    if (curSequence > maxSequence) { 
     maxSequence = curSequence; 
    } 

    return maxSequence; 
} 
2

Я вижу много избыточных logic..i думаю, что это будет делать ..

public static int getDecSeq(int[] data) { 
     int currentSeq = 1, longestSeq = 1; 

     for (int i = 1; i < data.length; i++) { 
      currentSeq = (data[i] < data[i - 1]) ? currentSeq + 1 : 1; 
      if (currentSeq > longestSeq) 
       longestSeq = currentSeq; 
     } 
     return longestSeq; 
    } 

Я рассмотрел предложение @Reese Мура.

+1

Внимание, если в последовательности есть только один элемент, вы вернете 0, но мы хотим 1. longestSeq должен начинаться с 1 –

+0

@ Loïc Février - Спасибо, отредактирован сейчас. –

0

Похоже, что настоящая проблема заключается в том, как правильно настроить данные, чтобы я мог использовать их в методе.

Я не утверждал массив правильно, чтобы использовать его в методе. Но метод работает отлично.

Смежные вопросы