找到最长的递减序列

时间:2010-11-04 20:29:54

标签: java arrays algorithm sequence

我试图在数组中找到最长的数字递减序列。我不确定我在以下代码中做错了什么。

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

7 个答案:

答案 0 :(得分:3)

4444444是否被认为正在减少?如果没有,那么您想要严格检查<而不是<=

你能提供更多,例如答案失败的地方吗?

答案 1 :(得分:2)

我看到很多冗余的逻辑......我认为这样做..

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的建议。

答案 2 :(得分:1)

据我所知,代码将正确计算最长序列的长度,只有一个错误使得在某些情况下错误地计算该序列的起始位置。将其更改为:

int currentSeq = 1;
int currentIndex = 0;

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

答案 3 :(得分:1)

这看起来非常像我的伪代码here。您未涉及的一个边缘情况是,如果循环从未运行,则返回什么。我会把这些视为特殊情况。

e.g。

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

答案 4 :(得分:0)

看一下分配longestSeq和longestIndex的时间。如果您首先在纸上勾画出您希望算法对给定测试输入执行的操作,然后在每次迭代时观察(打印)Seq和Index值的同时运行算法,将会有所帮助。

答案 5 :(得分: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;
}

答案 6 :(得分:0)

现在看来真正的问题是如何正确设置数据,以便我可以在方法中使用它。

我没有正确声明数组,以便在方法中使用它。但这种方法效果很好。