如何找到连续自然继承者的最长序列?

时间:2015-01-13 07:00:08

标签: java arrays

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

import java.util.Scanner;

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

        Scanner scan = new Scanner(System.in);
        int x = scan.nextInt();
        int nmbr[] = new int[x];
        for(int f=0;f<nmbr.length;f++)
            nmbr[f]=scan.nextInt();
        int counter = 0;
        int max = 0;
        for (int i = 0; i < nmbr.length - 1; i++) {
            if (nmbr[i] == (nmbr[i + 1]-1))
                counter++;
            else
                counter = 0;
            if (counter > max)
                max = (counter+1);
        }
        System.out.println(max);
    }
}

为什么我的代码仍在打印计数器而不添加一个?我没有发现错误 样品运行:

     7 2 3 5 6 7 9 10 
     2

它是打印2而不是3.

6 个答案:

答案 0 :(得分:1)

当您看到序列的第一个数字 out 时,您应该将counter重置为1而不是0 - 因为它是长度为的序列的开头至少 1.然后,您还需要更改更改max的代码:

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

毕竟,您只希望max成为counter的最大值。

(顺便说一下,我强烈建议您使用每个 if语句使用大括号 - 这样可以更容易避免错误。)

答案 1 :(得分:1)

 import java.util.Scanner;

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

        Scanner scan = new Scanner(System.in);
        int x = scan.nextInt();
        int nmbr[] = new int[x];
        for(int f=0;f<nmbr.length;f++) {
            nmbr[f]=scan.nextInt();
        }
        int counter = 0;
        int max = 0;
        for (int i = 0; i < nmbr.length - 1; i++) {
            if (nmbr[i] == (nmbr[i + 1]-1)) {
                counter++;
            } else {
                if (counter > max)
                    max = (counter+1);
                counter = 0;
            }
        }
        System.out.println(max);
    }
}

在你的逻辑中只是一个小错误,你每次计数器都大于max时更新max,所以下一次如果序列结束,它实际上无法注册为最长序列。只需按照我的方式对其进行重新排序即可。

答案 2 :(得分:0)

您没有考虑第一个号码,在这种情况下是5

i == 2为序列的开头时,nmbr[1]为3,因此计数器将为0

启动计数器为1(这是逻辑,因为最小的序列是1) 你需要改变if:

import java.util.Scanner;

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

         Scanner scan = new Scanner(System.in);
         int x = scan.nextInt();
         int nmbr[] = new int[x];
         for(int f=0;f<nmbr.length;f++)
             nmbr[f]=scan.nextInt();
         int counter = 1;
         int max = 1;
         for (int i = 0; i < nmbr.length - 1; i++) {
             if (nmbr[i] == (nmbr[i + 1]-1))
                 counter++;
             else
                 counter = 1;
             if (counter > max)
                 max = counter;
         }
         System.out.println(max);
    }
} 

答案 3 :(得分:0)

您的最大条件不正确:

if (counter > max)
    max = (counter+1);

您将最高与counter进行比较并指定counter+1。这种方式当max等于2时,它不能用2 + 1更新。

可能你应该使用:

if (counter + 1 > max)
    max = (counter+1);    

P.S。:您的问题并未显示研究工作。您可以使用调试输出来了解程序的运行情况。简单的例子:

for (int i = 0; i < nmbr.length - 1; i++) {
    if (nmbr[i] == (nmbr[i + 1]-1))
        counter++;
    else
        counter = 0;
    System.out.println("Current value: "+counter);
    if (counter > max) {
        max = (counter+1);
        System.out.println("New max value: "+max);
    }
}

答案 4 :(得分:0)

从1开始你的conter,因为如果你从0开始,那就意味着你没有计算第一个值。

else
    counter = 1;

并在分配到最大

时更改计数器的增量
max =counter;

答案 5 :(得分:0)

这是一个简单的问题,并且在之前的答案中已经指出,您错误地在代码中设置了计数器的值。

通过调试器运行代码,以跟踪您希望从程序中获得的变量值与实际获得的变量值。

逐步执行每行代码可以帮助您更好地理解错误。