问题:以空格分隔的一组数字作为输入传递。程序必须打印数字中存在的最大蛇序列。蛇序列由相邻的数字组成,对于每个数字,右边或左边的数字是它的值的+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的较大输入快速运行?
答案 0 :(得分:1)
您是否尝试过使用整数数组进行处理?
Scanner sc = new Scanner(System.in);
String s = sc.nextLine(); //The numbers entered in string format separated by spaces
String ss = s.split(" "); //Numbers separated by space will be put as individual numbers in a String array but each number is still in string format
int l = ss.length, i = 0;
int[] n = new int[l]; //The integer array which will store the values
for(i = 0; i < l; i++)
{
n[i] = Integer.parseInt(ss[i]); //Has integers now instead of string numbers
}
可能会创建一些额外的数组,但是反复调用Character.getNumericValue()
函数也会降低效率。也可以解决你的StringBuffer问题。
但是SkillRack无论如何都很烦人。
答案 1 :(得分:0)
您的比较并未找到负值的相邻数字。
例如:Abs(-2) - (-3) = 5
但-2
和-3
应该相邻。
好。我看到你正在分析 - 并分别数字。
鉴于对蛇序列的要求,最长的蛇序列为&#34; 5 6 7 9 8 8&#34;是&#34; 5 6 7&#34;。上面列出的输出与定义不符:&#34;相邻数字,使得对于每个数字,右边或左边的数字是它的值&#34;的+1或-1。 &#34; 5 6 7 8 9 8&#34;满足&#34; 5 6 7 9 8 8&#34;的蛇序列的定义?对不起,我无能为力。
您可能希望将代码解析为整数,将最长的序列存储在地图中。
@Test
public void testSnake(){
String t2 = "9 8 7 5 3 0 1 -2 -3 1 2";
List<String> numsStr = Arrays.asList(t2.split(" "));
List<Integer> nums = new ArrayList();
HashMap<Integer,List<Integer> > numMap = new HashMap();
numsStr.forEach((s) -> {
Integer val = Integer.decode(s);
nums.add(val);
});
nums.forEach((num) -> {
System.out.println("num: " + num);
// track longest sequence, store in numMap
});
// Print numMap
}