我在LinkedIn组
here上看到了这个采访问题
总结一下,如果我有一个数组
[1,2,3,4,5]
和输入
3
我需要输出
[1,2,3], [3,2,1], [2,3,1], [2,1,3], [1,3,2], [3,1,2], [2,3,4], [4,3,2],...
没有特别的顺序.
我一直在考虑这个问题.我提出了各种不同的解决方法,但所有方法都使用for循环.
我认为很明显,为了消除循环,它必须是递归的.
我认为我已经接近这个递归分区数组和连接元素,但非常沮丧我最终需要另一个for循环.
我开始认为这是不可能的(它不可能,否则为什么面试问题?).
任何想法或链接?可能的输出量应为5PN,其中N为输入.
最佳答案 以下递归算法将尝试打印{1,..,n}的每个子集.这些子集通过以下双射一对一地具有0到2 ^ n-1之间的数字:对于0到2 ^ n-1之间的整数x,如果x的第一位设置为0,则关联包含1的集合一,如果x的第二位设置为1,则为2,…
void print_all_subsets (int n, int m, int x) {
if (x==pow(2,n)) {
return;
}
else if (x has m bits set to one) {
print the set corresponding to x;
}
print_all_subsets(n,m,x+1);
}
您需要使用n = 5(在您的情况下),m = 3(在您的情况下)和x = 0来调用它.
然后你需要实现两个函数“打印对应于x的集合”和“x有m位设置为1”而不用for循环…但这很容易使用再次递归完成.
但是,我认为这更具挑战性 – 完全消除for循环没有意义,只有以聪明的方式使用它们才有意义.