给定一个数d和一个数n
我必须打印长度n的所有组合,以便第一个元素d和所有其他元素
与上一个相距1英里。
例如,对于输入d=4 n=3
输出
4 3 2 4 3 4 4 5 4 4 5 6
我写了下面的代码,但是每行显示两次,如下所示-
4 3 2 4 3 2 4 3 4 4 3 4 4 5 4 4 5 4 4 5 6 4 5 6
代码-

private static void printNumbers(int d, int n, String comb) {
    if(n == 0) {
        System.out.println(comb);
        return;
    }

    printNumbers(d-1, n-1, comb+d+"\t");
    printNumbers(d+1, n-1, comb+d+"\t");
}

方法调用看起来像-
 printNumbers(4,3,"");

我试着调试,但无法给出没有重复输出的测试条件。
我知道我们可以使用Set或类似的ds来避免重复,但我想知道是否存在不使用额外空间的解决方案。

最佳答案

你的问题是,当n == 1时,你打电话给:

printNumbers(d-1, 0, comb+d+"\t");
printNumbers(d+1, 0, comb+d+"\t");

它将打印字符串两次。
您可以通过更改停止标准轻松解决此问题:
private static void printNumbers(int d, int n, String comb) {
    if(n == 1) {
    //      ^ change here
        System.out.println(comb + d);
        //                      ^ change here
        return;
    }

    printNumbers(d-1, n-1, comb+d+"\t");
    printNumbers(d+1, n-1, comb+d+"\t");
}

10-06 05:34