Java 求最长递减序列

Java 求最长递减序列,java,arrays,algorithm,sequence,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] <

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

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 
我做得不对。我的方法有效。当我将变量数据声明为:

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
publicstaticdouble[]getData(扫描仪输入){
double[]list=new double[70];//构造一个长度为70的数组来保存文件中的值
整数计数=0;
while(input.hasNextDouble()){
double n=input.nextDouble();
列表[计数]=n;
计数++;
}
double[]newList=新的double[计数];
for(int i=0;i
是否认为
444
正在减少?如果没有,那么您需要严格检查
在分配longestSeq和longestIndex时查看一下。如果您首先在纸上勾勒出算法对给定测试输入的打算,然后在每次迭代中观察(打印)Seq和Index值的同时运行算法,这将有所帮助。

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

int currentSeq = 1;
int currentIndex = 0;

int longestSeq = 0;
int longestIndex = 0;
for (int i = 1; i < data.length; i++) {
...
int currentSeq=1;
int currentIndex=0;
int longestSeq=0;
int longestIndex=0;
对于(int i=1;i
我认为这可以简单一点。
如果不需要,实际上不需要保留索引

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;
}
public int getDecSeq(双[]数据)
{
int curSequence=1;
int maxSequence=1;
对于(int i=1;i数据[i-1]){
if(curSequence>maxSequence){
maxSequence=curSequence;
}
curSequence=1;
}否则{
curSequence+=1;
}
}
if(curSequence>maxSequence){
maxSequence=curSequence;
}
返回maxSequence;
}

我看到了很多冗余逻辑..我想这样就可以了

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;
    }
public static int getDecSeq(int[]数据){
int currentSeq=1,longestSeq=1;
对于(int i=1;ilongestSeq)
longestSeq=currentSeq;
}
返回长seq;
}

我考虑了@Reese Moore的建议。

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

e、 g

if(data.length<2)返回data.length;

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


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

你有什么问题?请给出一个你的算法不起作用的例子…另请参见:(但不要复制!)你的
getData
是什么?请发布此函数的代码。检查getData的结果(尝试
System.out.println(Arrays.toString(getData(input));
)数组内容是否与您希望看到的内容匹配?可能您误解了文件格式(例如,文件中的第一行是否显示后面有多少个Double?)这正是我用来查看getData结果的内容,所以它是相同的。我想这可能是Robert想要的。感谢您的关注。我忘了除掉=但这仍然不起作用。@Robert请举个例子!!结果证明方法是正确的,数据(实际数组)的声明是错误的。@Robert:好!请看下面来自johnbk(较短代码)和user434507(错误更正)的答案。请选择其中一个答案。可能确实存在问题,但由于输出是
longestSeq
,因此代码无论如何都应该工作……如果当前索引从0开始,则在第一次检查时将抛出
ArrayOutOfBoundsException
。注意
数据[i-1]
哦,我明白了,但是currentIndex的起始位置的定义是不相关的。你甚至不需要跟踪它。你可以通过取新的最长序列的结尾并减去它的结尾来计算最长索引。@Reese:不要介意,即使知道他返回的内容也没有关系。注意,如果序列只有一个元素,你将返回0,但我们需要1。longestSeq必须从1开始
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;
    }
 if ( data.length < 2 ) return data.length;