【问题标题】:Find the longest decreasing sequence找到最长的递减序列
【发布时间】:2010-11-04 20:29:53
【问题描述】:

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

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

【问题讨论】:

  • 你有什么问题?请举一个你的算法不起作用的例子......
  • 参见:stackoverflow.com/questions/3878105/…(但不要复制!)
  • 你的getData 是什么?请贴出这个函数的代码。
  • 检查 getData 的结果(尝试System.out.println(Arrays.toString(getData(input)));) 数组内容是否符合您的预期?也许您误解了文件格式(例如,文件中的第一行是否说明后面有 多少 个双打?)
  • 这正是我用来查看getData结果的,所以是一样的。

标签: java arrays algorithm sequence


【解决方案1】:

4444444 是否被认为是递减的?如果不是,那么您要严格检查&lt; 而不是&lt;=

您能否提供更多信息,例如您的答案失败的地方?

【讨论】:

  • 我认为这可能是罗伯特可能正在寻找的。​​span>
  • 感谢您的关注。我忘了去掉 = 但这仍然无法正常工作。
  • @Robert 请举个例子!!
  • 原来方法是正确的,数据(实际的数组)被错误地声明了。
  • @罗伯特:好!看看下面 johnbk(更短的代码)和 user434507(错误更正)的答案。请选择其中一个答案。
【解决方案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 的建议。

【讨论】:

  • 注意,如果序列只有一个元素,你将返回 0,但我们想要 1。longestSeq 必须从 1 开始
【解决方案3】:

这看起来非常像我发布的here 的伪代码。您尚未涵盖的一种极端情况是,如果循环从未运行,则返回什么。我会将这些视为特殊情况。

例如

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

【讨论】:

    【解决方案4】:

    据我所知,该代码将正确计算最长序列的长度,只有一个错误导致它在某些情况下错误地计算该序列的起始位置。改成这样:

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

    【讨论】:

    • 可能确实是问题,但因为输出是longestSeq,所以代码应该可以正常工作......
    • 如果当前索引从 0 开始,第一次检查时会抛出一个ArrayOutOfBoundsException。注意data[i - 1]
    • 哦,我明白了,但是 currentIndex 从哪里开始的定义是无关紧要的。你甚至不需要跟踪它。您可以通过取新的最长序列的末尾并减去它的末尾来计算最长的索引。
    • @Reese:没关系,考虑到他返回的内容,知道它甚至不相关。
    【解决方案5】:

    看看你什么时候分配了longestSeq和longestIndex。如果您首先在纸上勾勒出您希望算法为给定的测试输入做什么,然后在每次迭代中观察(打印)Seq 和 Index 值的同时运行算法,这将有所帮助。

    【讨论】:

      【解决方案6】:

      我认为这可能会简单一些。
      如果不需要,实际上不需要保留索引。

      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;
      }
      

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-11
          • 1970-01-01
          相关资源
          最近更新 更多