找到整数arraylist中最大的数字序列

时间:2013-09-25 01:19:10

标签: java arraylist sequences

这是我到目前为止所得到的。我试图做的是在if语句中使用more或equals来查找序列。然后当该值不再大于或等于预设数字时,它进入else语句,该语句记录该序列号并重置它,以便计数可以再次开始。所有这些序列值都保存在arraylist中,这样当我完成所有操作后,我可以进行简单的比较,找到最大的序列号并返回。我需要帮助我收集序列数据的第一个if / else语句,因为我很确定这是我的问题发生的地方。

public class LongestSequence {

    public static int getMaxSequence(ArrayList<Integer> list) {
        int sequence = 0;
        ArrayList<Integer> temp = new ArrayList<Integer>();

        for (int i = 0; i < list.size() - 1; i++) {
            //this is where things go wrong. I think.
            if (list.get(i + 1) >= list.get(i)) {
                sequence++;
            } else {
                //record the number in your arraylist
                temp.add(sequence);
                //reset count to 0
                 sequence = 0;
            }
         }

        int greatestnum = 0;

        for (int i = 0; i < temp.size() - 1; i++) {
            if (temp.get(i) < temp.get(i + 1)) {
                greatestnum = temp.get(i + 1);
            } else {
                greatestnum = temp.get(i);
            }
        }
        return greatestnum;
    }

7 个答案:

答案 0 :(得分:8)

您不必为此使用临时列表。只需使用计数器循环遍历数组或列表,并为每个大于或等于前一个元素的元素递增。使用另一个变量来存储最大值:

int[] a = { 1, 2, 3, 4, 0, 19, 1, 1, 2, 2, 3, 3, 2 };

int count = 1, max = 1;

for (int i = 1; i < a.length; i++) {
    if (a[i] >= a[i - 1]) {
        count++;
    } else {
        count = 1;
    }

    if (count > max) {
        max = count;
    }
}

System.out.println(max);
6

这里,count是连续和排序元素的数量。我们在连续/增加连续时增加它。一旦此条纹中断(else子句),我们会检查count是否大于max,我们的变量用于存储最大计数:如果是,我们将max设置为count。然后我们将count设置回1,因为在else条款中我们知道条纹已经结束,我们需要重新开始。

(我在这里使用了一个数组,但将上面的代码转换为列表应该是微不足道的。)

答案 1 :(得分:1)

  

可以递归地完成:

public static int getMaxSequence(List<Integer> list){
  if (list == null) return 0;
  if (list.size() == 1) return 1;

  return getMaxSequence(list.get(0), list.subList(1, list.size()),1);
}

public static int getMaxSequence(int head, List<Integer> tail,int soFar) {

  if (tail == null) return 0;
  if (tail.size()==0) return soFar;

  if (head <= tail.get(0)){
    soFar++; //the sequence gets bigger
  }else{
    soFar = 1; //restart the sequence
  }

  final int nextSeq = getMaxSequence(tail.get(0),tail.subList(1, tail.size()),soFar);

  //finally return what we have found so far or the longest sequence down the list
  return Math.max(soFar, nextSeq);      
}

并像这样使用:

final List<Integer> list = Arrays.asList(1, 2, 3, 4, 0, 19, 1, 1, 2, 2, 3, 3, 2);
System.out.println(getMaxSequence(list));

虽然使用LinkedList的实例应该更快,但它应该适用于任何List。

答案 2 :(得分:1)

这类似于arshajii的答案,但是当序列位于数组的末尾时,建议使用修复。 这个答案还会检查单调增加或相等的数字。

https://jsfiddle.net/ppy6tdt8/

var a = [ 1, 2, 3, 4, 0, 19, 1, 1, 2, 2, 3, 3, 2 ];
var b = [1,2,4,5,7,8,9];

function getSpan ( a ) {

if (a.length < 2) {
    return 1;
}

var count = 1, max = 1;

for (var i = 1; i < a.length; i++) {
    if (a[i] == a[i - 1]+1 || a[i] == a[i - 1]) {
        if (++count > max) {
            max = count;
        }
    } else {
        count = 1;
    }
}
return ( max );
}

console.log (getSpan(a));
console.log (getSpan(b));

答案 3 :(得分:0)

为了保持最初使用的数据结构 - 这就是我建议解决这个问题的方法。

测试参数:

ArrayList<Integer> list = new ArrayList<Integer>();

list.add(12);
list.add(12345);
list.add(999999999);

System.out.println(getMaxSequence(list));

现在,我只是将所有值与indx 0进行比较,但完全没有必要:)

public static int getMaxSequence(ArrayList<Integer> list) {

    int indx = 0;
    int currmax = 0;
    currmax = list.get(indx).toString().length();
    while (indx < list.size()) {

        if (currmax <= list.get(indx).toString().length()) {
            currmax = list.get(indx).toString().length();
        } else
            return currmax;

        // list.remove(indx);
        indx++;

    }

    return currmax;

}

答案 4 :(得分:-1)

增长最长的子序列问题是一个动态编程问题,它计算给定序列中非连续子序列的长度

import java.io.*;
public class CandidateCode 
{ 
public static int longestSeq(int[]seq){
int[]L=new int[seq.length];
L[0]=1;
for(int i=1;i<L.length;i++){
int maxn=0;
for(int j=0;j<i;j++){
if(seq[j]<seq[i]&&L[j]>maxn){
maxn=L[j];
}
}
L[i]=maxn+1;
}
int maxi=0;
for(int i=0;i<L.length;i++){
if(L[i]>maxi){
maxi=L[i];
}
}
return(maxi);
}
}

答案 5 :(得分:-1)

您可以使用java util本身的集合,并可以明确地从arraylist中找到。

ArrayList<Integer> list = new ArrayList<Integer>();

// Here add data to ArrayList

int maxNum =  Collections.max(list);

maxNum是列表中的最大整数。

答案 6 :(得分:-1)

您可以使用以下算法来获取任何给定ArrayList中存在的最大整数序列。

  1. 将列表的所有整数添加到Set。
  2. 迭代Set。
  3. 检查Set中是否存在元素if(element-1)。如果是,请继续下一次迭代,因为它不是序列的开始。
  4. 否则,在while循环中检查Set中元素的连续元素数。
  5. 提及算法的示例程序将如下所示:

    package org.practice.algorithms.arrays;
    
    import java.util.ArrayList;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Set;
    
    public class LargestSequence {
    
        public Integer[] getLargestSequence(Integer[] numberArray) {
    
            List<Integer> largestSequence = new ArrayList<Integer>();
            int largestSequenceCount = 0;
    
            Set<Integer> numbersSet = getSetFromArray(numberArray);
    
            for (Integer integer : numbersSet) {
                if(numbersSet.contains(integer -1)) {
                    //this number is not the start of the sequence.
                    continue;
                } else {
                    int count = 0;
                    List<Integer> largestSequenceTemp = new ArrayList<Integer>();
                    while(numbersSet.contains(integer)) {
                        largestSequenceTemp.add(integer);
                        integer++;
                        count++;
                    }
                    if(count > largestSequenceCount) {
                        largestSequenceCount = count;
                        largestSequence = largestSequenceTemp;
                    }
                }
    
            }
            return largestSequence.toArray(new Integer[largestSequence.size()]);
        }
    
        private Set<Integer> getSetFromArray(Integer[] numberArray) {
            Set<Integer> numbersSet = new HashSet<Integer>();
            if(null != numberArray && numberArray.length > 0) {
                for (int number : numberArray) {
                    numbersSet.add(number);
                }
            }
            return numbersSet;
        }
    }