最长的蛇序列

时间:2015-06-11 18:25:57

标签: java arrays recursion sequence permutation

问题:以空格分隔的一组数字作为输入传递。程序必须打印数字中存在的最大蛇序列。蛇序列由相邻的数字组成,对于每个数字,右边或左边的数字是它的值的+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 个答案:

答案 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
}