簡體   English   中英

編寫一個程序來查找整數數組中最長的連續序列的長度?

[英]Write a program to find length of longest consecutive sequence in array of integers?

例如,給定[100,4,2,1,3,2],最長的連續元素序列是[1,2,3,4]。

 public class Array {
  public static void main(String args[]){

    int a[]={10,15,1,2,3,4,5,11,12};

    int b=1;
    int c=0;
    for(int i=0;i<a.length-1;i++){

       if(a[i]-a[i+1]==-1){

         b=b+1;
         c=c+1;
         if(b>=c)
       {

       System.out.println(a[i]);

         }
         else{
             b=0;
         } 

    }

}
}
}

但我的輸出為1 2 3 4 11,而輸出應為1 2 3 4 5。

如何獲得所需的輸出,是什么代碼中的錯誤?

你可以嘗試一下:

int[] array = {10,15,1,2,3,4,5,11,12};
List<Integer> tempList = new ArrayList<>(); // prepare temp list for later use
List<List<Integer>> arrays = new ArrayList<>(); // used to store the sequences
int lastNum = array[0]; // get the fist number for compasion in loop
tempList.add(lastNum);
for (int i = 1; i < array.length; i++) {
    if (array[i]-1 == lastNum) { // check for sequence (e.g fist num was 12,
      // current number is 13, so 13-1 = 12, 
      // so it has the sequence), then store the number
        tempList.add(array[i]); // store it to the temp list
        lastNum = array[i]; // keep current number for the next
    } else { // if it has not the sequence, start the new sequence
        arrays.add(tempList); // fist store the last sequence
        tempList = new ArrayList() // clear for the next sequence
        lastNum = array[i]; // init the lastNumnber
        tempList.add(lastNum);
    }
}
// now iterate for the longest array
// craete an empty array to store the longest
List<Integer> longestLength = new ArrayList<>();
for (List<Integer> arr : arrays) {
    if (arr.size() > longestLength.size()) {
        // check if the current array hase the longest size than the last one
        // if yes, update the last one
        longestLength = arr;
    }
}
// at the end print the result.
System.out.println("longestLength = " + longestLength);

結果:

longestLength = [1, 2, 3, 4, 5]

試試這個代碼

public class Array {
      public static void main(String args[]){

        int a[]={10,15,1,2,3,4,5,11,12};

        int ms=0;                  // starting point of max subseq
        int me=0;                   //ending point of max subseq
        int cs=0,ce=0;              //starting and ending  point of current subseq
        int max=0,c=0;           // length of max and current subseq
        for(int i=0;i<a.length-1;i++){

           if(a[i]-a[i+1]==-1){

             if(c==0)             //we found the first element of a subseq
             {
               cs=i;ce=i+1;c=2;   //made the starting of currrent seq=i, end=i+1 and length=2
              }
             else             // element is a part of subsequence but not first elem
              {
               ce=i+1;c++;     // increased current ending point
              } 

              if(c>max)          // if lenth of current subseq is now largest then update staring and ending points of max
               {
                   max=c;
                   ms=cs;
                   me=ce;
               }
             }
             else             // subseq ended
             {
             cs=0;
             ce=0;
             c=0;
              }
      }
        for(i=ms;i<=me;i++)           //printing max subsequence
         System.out.println(a[i]);
    }
    }

注意:請參閱注釋以獲取說明

如果首先對數組進行排序,則代碼應該可以正常工 你試過嗎?

import java.util.*;
    Arrays.sort(a);

然后

    if(a[i]+1==a[i+1])
          //print it 
     else
        {
            System.out.print(a[i]);
            i=a.length;
        }//stop the loop
class Test
{
    public static void main (String[] args) throws java.lang.Exception
    {
        int a[]={10,15,1,2,3,4,5,11,12};
        Arrays.sort(a);
        ArrayList<Integer>output = new ArrayList<Integer>();
        ArrayList<Integer>temp = new ArrayList<Integer>();
        for(int i =1; i<a.length; i++){
            //If elements have difference of one, add them to temp Arraylist
            if(a[i-1] + 1 == a[i]){
                temp.add(a[i-1]);
            }
            else{
                //Add the last consecutive element 
                temp.add(a[i-1]);

                //If temp is lager then output
                if(temp.size() > output.size()){
                    output = (ArrayList<Integer>) temp.clone();
                        temp.clear();
                }           
            }
        }

        //Outside for loop, making sure the output is the longer list. This is to handle the case where the consecutive sequence is towards the end of the array
        if(temp.size() > output.size()){
            output = (ArrayList<Integer>) temp.clone();System.out.println("after clone outside for " + output.toString());
        }   
        System.out.println(output.toString());
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM