如果第二个整数是自然数序列中的第一个的继承者,则两个连续的整数是自然后继的(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.
答案 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)
这是一个简单的问题,并且在之前的答案中已经指出,您错误地在代码中设置了计数器的值。
通过调试器运行代码,以跟踪您希望从程序中获得的变量值与实际获得的变量值。
逐步执行每行代码可以帮助您更好地理解错误。