Найдите самую длинную убывающую последовательность - PullRequest
2 голосов
/ 04 ноября 2010

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

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 (вход) возвращает набор чисел из файла и сохраняет их в массиве.

Я написал:

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

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

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

Все работало просто отлично.Так как же переписать способ вызова данных для работы?

getData is

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

Ответы [ 7 ]

3 голосов
/ 04 ноября 2010

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

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

2 голосов
/ 04 ноября 2010

Я вижу много избыточной логики .. я думаю, что это подойдет ..

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 Moore.

1 голос
/ 05 ноября 2010

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

например

 if ( data.length < 2 ) return data.length;
1 голос
/ 04 ноября 2010

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

int currentSeq = 1;
int currentIndex = 0;

int longestSeq = 0;
int longestIndex = 0;
for (int i = 1; i < data.length; i++) {
...
0 голосов
/ 06 ноября 2010

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

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

0 голосов
/ 04 ноября 2010

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

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;
}
0 голосов
/ 04 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...