【发布时间】:2020-06-23 20:16:14
【问题描述】:
假设我们有一个数组 {1, 1, 2, 3, 6, 5, 5, 4, 6}
找出数组中最长的连续奇数/偶数或偶数/奇数子序列。
答案是 5:{1, 2, 3, 6, 5}
我的想法是找到两个子序列
- 起始编号为奇数
- 起始编号为偶数
返回两者的最大值
我写的代码找到了最长的子序列,但是不连续
public static int longestAlternativeSequence(int[] a, int n) {
int maxOdd = 0; //Max subsequence starting with odd Number
int maxEven = 0; //Max subsequence starting with even Number
int odd = 0;
int even = 0;
for (int i = 0; i < n; i++) {
if (odd == 0) { // first number has to be odd
if (a[i] % 2 == 1) {
odd = 1;
maxOdd++;
}
}
else {
if (a[i] % 2 == 0) {
odd = 0;
maxOdd++;
}
}
}
for (int i = 0; i < n; i++) {
if (even == 0) { //first number has to be even
if (a[i] % 2 == 0) {
even = 1;
maxEven++;
}
}
else {
if (a[i] % 2 == 1) {
even = 1;
maxEven++;
}
}
}
return Math.max(maxOdd, maxEven);
}
public static void main(String[] args) {
int a[] = {1, 1, 2, 3, 6, 5, 5, 4, 6};
int n = a.length;
System.out.println(longestOddEven(a, n)); //returns 6
}
【问题讨论】:
-
编写一个方法,从一个位置开始遍历数组并返回偶数/奇数或奇数/偶数子序列的长度。编写另一个方法,为数组的每个元素调用第一个方法,当剩余元素小于找到的最长子序列时结束。
-
我想出的代码找到了最长的子序列,但它不是连续的
-
您正试图以一种方法完成所有工作。我最初的建议仍然有效。分而治之。使用两种或多种方法。
-
@GilbertLeBlanc 使用不止一种方法只会使事情复杂化。你只需要嵌套循环。
-
@AndyTurner 我试图降低 OP 的心理问题复杂性,而不是代码复杂性。一次只专注于问题的一小部分。此外,单独的方法更容易测试。
标签: java arrays algorithm subsequence