【发布时间】:2015-06-11 18:25:57
【问题描述】:
问题:以空格分隔的一组数字作为输入传递。程序必须打印数字中存在的最大蛇序列。蛇序列由相邻的数字组成,因此对于每个数字,右侧或左侧的数字是其值的 +1 或 -1。如果可能有多个最大长度的蛇序列,则打印以自然输入顺序出现的蛇序列。
输入/输出示例 1:
输入:
5 6 7 9 8 8
输出:
5 6 7 8 9 8
8 9 8 7 6 5
示例输入/输出 2:
输入:
9 8 7 5 3 0 1 -2 -3 1 2
输出:
3 2 1 0 1
void doPermute(int[] in, StringBuffer out, boolean[] used, int length, int level, StringBuffer max) {
if (level == length) {
int count = 0;
for (int i = 1; i < out.length(); i++) {
if (Math.abs(Character.getNumericValue(out.charAt(i)) - Character.getNumericValue(out.charAt(i - 1))) != 1) {
//System.out.println(Character.getNumericValue(i) - Character.getNumericValue(i - 1) + " " + i + " yes");
count++;
break;
}
}
if (count == 0) {
max.append(out + " ");
}
return;
}
for (int i = 0; i < length; ++i) {
if (used[i]) {
continue;
}
out.append(in[i]);
used[i] = true;
doPermute(in, out, used, length, level + 1, max);
used[i] = false;
out.setLength(out.length() - 1);
}
}
当我使用 StringBuffer 时,我的代码通过了包含正值的测试用例(第一个测试用例),但在包含负值的测试用例中失败了(第二个测试用例)。
更新:-
我将 stringbuffer 替换为 Integer[] 并进行了一些更改。它适用于长度为 8 或 9 的较小输入。如何使其快速用于长度为 13 到 15 的较大输入?
【问题讨论】:
-
它是如何失败的?你得到了什么输出?你的问题是什么?您是否已努力调试程序并缩小问题所在?
-
使用字符串缓冲区它需要 -2 作为 - 和 2
-
你能说得更详细些吗?我剩下的问题呢?
-
@tnw 在测试用例 1 中,都是正值,所以它置换为 567889,然后 567898 等等,而在负值的情况下如 5 6 7 8 8 -9,它置换为 5 6 7 8 8 - 9。所以它认为'-'符号是一个字符而不是'-9'。
-
好吧,
doPermute中的 for 循环每次从StringBuffer获取一个字符并对其进行处理。是什么让您认为它应该 将-和9视为-9?如果要将内容解析为数字,则需要这样做。
标签: java arrays recursion sequence permutation