以前很少接触算法,没有遇到过这种问题,但是,在做美团、CVTE的前端笔试题时,都遇到过这种智力题:
根据规律求括号中的数:
1,1,2,5,14,()
我怎么知道这个规律会是:
-_-||(看来我基础确实不好)
所以连续懵逼两次,后来再做另外一道题的时候才了解到这个数列 ”卡塔兰数”。。。
题目是这样的:已知入栈顺序是1,2,3,4,5,6,7 ,求出栈可以有多少种,答案就是上式C7=429。
但是如果还要求所有的出栈具体顺序呢?
思路:每个时刻,当前栈都有两种选择,继续入栈,或者出栈。因此,用递归就可以实现了。
JavaScript代码:
function main(data){
data = data.reverse();
var n = data.length;
var res = [];
process(data,[],[],n);
return res;
function process(data, stack, result, n){
if(result.length>=n){
//console.log(result);
res.push(result);
return;
}
//入栈
if(data.length>0){
var d = data[data.length-1];
var stackNew1 = stack.concat(d);
var dataNew1 = data.slice(0,-1);
var resNew1 = result.slice(0);
//console.log("入栈",dataNew.join(),"|",stackNew.join(),"|",resNew.join());
process(dataNew1,stackNew1,resNew1, n);
}
//或者出栈
if(stack.length>0){
var p = stack[stack.length-1];
var stackNew2 = stack.slice(0,-1);
var dataNew2 = data.slice(0);
var resNew2 = result.concat(p);
//console.log("出栈",dataNew1.join(),"|",stackNew1.join(),"|",resNew1.join());
process(dataNew2,stackNew2,resNew2, n);
}
}
}
当data=[1,2,3,4,5,6,7] ,看看有多少种可能:
var data = [1,2,3,4,5,6,7];
console.log(main(data).length);//429
。。。。。。。。。。。。。
当data=[1,2,3,4] ,看看是哪些组合:
var data = [1,2,3,4];
console.log(main(data));
输出:
[ [ 4, 3, 2, 1 ],
[ 3, 4, 2, 1 ],
[ 3, 2, 4, 1 ],
[ 3, 2, 1, 4 ],
[ 2, 4, 3, 1 ],
[ 2, 3, 4, 1 ],
[ 2, 3, 1, 4 ],
[ 2, 1, 4, 3 ],
[ 2, 1, 3, 4 ],
[ 1, 4, 3, 2 ],
[ 1, 3, 4, 2 ],
[ 1, 3, 2, 4 ],
[ 1, 2, 4, 3 ],
[ 1, 2, 3, 4 ] ]