給定入棧順序求所有出棧可能性

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章