以前很少接觸算法,沒有遇到過這種問題,但是,在做美團、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 ] ]