问题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;
}
}
答案 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
HashSet
中,以删除重复项。HashSet
中选择第一个值并将其分配给start
和end
,然后将其从集合中删除。start
并检查它是否存在于HashSet
中并继续直到start
中HashSet
的特定值不存在,同时删除值为end
从集合中搜索。end
执行相同操作,但每次迭代必须增加start
的值。end
到current_Max = end - start + 1
的连续范围,其范围为current_Max
HashSet
以获得整个阵列的最长自然后继。 由于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