找到最长的连续数字序列

时间:2014-12-03 23:01:13

标签: java arrays

问题H(最长的自然继承者):

如果第二个整数是自然数序列中的第一个的继承者,则两个连续的整数是自然后继的(1和2是自然后继者)。编写一个程序,读取一个数字N后跟N个整数,然后打印最长连续自然后继序列的长度。

示例:

输入7 2 3 5 6 7 9 10输出3这是我的代码到目前为止我不知道为什么它不起作用

import java.util.Scanner;

public class Conse {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int x = scan.nextInt();
        int[] array = new int[x];
        for (int i = 0; i < array.length; i++) {
            array[i] = scan.nextInt();
        }
        System.out.println(array(array));

    }

    public static int array(int[] array) {
        int count = 0, temp = 0;
        for (int i = 0; i < array.length; i++) {
            count = 0;
            for (int j = i, k = i + 1; j < array.length - 1; j++, k++) {
                if (Math.abs(array[j] - array[k]) == 1) {
                    count++;
                } else {
                    if (temp <= count) {
                        temp = count;
                    }
                    break;
                }
            }
        }
        return temp + 1;
    }

}

4 个答案:

答案 0 :(得分:2)

为什么要两个循环?

怎么样?
public static int array(final int[] array) {
    int lastNo = -100;
    int maxConsecutiveNumbers = 0;
    int currentConsecutiveNumbers = 0;

    for (int i = 0; i < array.length; i++) {
        if (array[i] == lastNo + 1) {
            currentConsecutiveNumbers++;
            maxConsecutiveNumbers = Math.max(maxConsecutiveNumbers,
                    currentConsecutiveNumbers);
        } else {
            currentConsecutiveNumbers = 1;
        }
        lastNo = array[i];
    }
    return Math.max(maxConsecutiveNumbers, currentConsecutiveNumbers);
}

答案 1 :(得分:0)

这似乎有效:

public static int longestConsecutive(int[] array) {
    int longest = 0;
    // For each possible start
    for (int i = 0; i < array.length; i++) {
        // Count consecutive.
        for (int j = i + 1; j < array.length; j++) {
            // This one consecutive to last?
            if (Math.abs(array[j] - array[j - 1]) == 1) {
                // Is it longer?
                if (j - i > longest) {
                    // Yup! Remember it.
                    longest = j - i;
                }

            } else {
                // Start again.
                break;
            }
        }
    }
    return longest + 1;
}

public void test() {
    int[] a = new int[]{7, 2, 3, 5, 6, 7, 9, 10};
    System.out.println("Longest: " + Arrays.toString(a) + "=" + longestConsecutive(a));
}

打印

Longest: [7, 2, 3, 5, 6, 7, 9, 10]=3

答案 2 :(得分:0)

因为你的问题有&#34;问题H&#34;与之相关,我假设你只是在学习。更简单总是更好,所以通常需要将其分解为&#34; 必须完成的事情&#34;在开始特定的道路之前,通过编写接近问题的代码&#34; 如何可以做到这一点。&#34;

在这种情况下,您可能会使数组过于复杂。如果数字大于前一个数字,则数字是自然继承者。如果是,则增加当前序列的计数。如果没有,我们就开始新的序列。如果当前序列长度大于我们所见的最大序列长度,则将最大序列长度设置为当前序列长度。不需要数组 - 您只需要比较两个数字(当前和最后读取的数字)。

例如:

public static void main(String[] args) {
 Scanner scan = new Scanner(System.in); 

 int N = scan.nextInt();

 int maxSequenceLen = 0;  // longest sequence ever
 int curSequenceLen = 0;  // when starting new sequence, reset to 1 (count the reset #)
 int last = 0;

 for(int i = 0; i < N; i++) {
     int cur = scan.nextInt();
     if ((last+1) == cur){
         ++curSequenceLen;
     }
     else{
         curSequenceLen = 1;
     }
     if (curSequenceLen > maxSequenceLen){
         maxSequenceLen = curSequenceLen;
     }
     last = cur;
 }
 System.out.println(maxSequenceLen);

警告:我在没有Java开发环境的计算机上回答这个问题,因此代码未经测试。

答案 3 :(得分:0)

我不确定我是否正确理解了这个问题。这里写的答案假设自然继承者连续发生。但如果这不相同,那么这里的解决方案可能无法给出正确的答案。

假设输入为[7 2 3 5 6 7 9 10]而不是[7 2 6 3 7 5 6 9 10],则答案变为2,而数组中存在自然后继[5 6 7]

如果输入没有排序,我们将不得不使用不同的方法。就像使用HashSet

一样
  1. 将整个数组加载到HashSet中,以删除重复项。
  2. HashSet中选择第一个值并将其分配给startend,然后将其从集合中删除。
  3. 现在递减start并检查它是否存在于HashSet中并继续直到startHashSet的特定值不存在,同时删除值为end从集合中搜索。
  4. end执行相同操作,但每次迭代必须增加start的值。
  5. 我们现在需要从集合中的endcurrent_Max = end - start + 1的连续范围,其范围为current_Max
  6. 在每次迭代中,我们跟踪此HashSet以获得整个阵列的最长自然后继。
  7. 由于O(1)支持在O(n)时间内添加,删除,更新。此算法将在n时间运行,其中char string1[] = "string"; char string2[] = "Description"; char string3[] = "BIOS Date: 05/12/15 15:30:43 Ver: 04.06.05"; char *buffer = new char[64]; int resx = _snprintf(buffer, 64, "[%03u] %s %s = (%s)", 16, string1, string2, string3); 是输入数组的长度。 C#中此方法的代码可以找到here