给定入栈顺序求所有出栈可能性

来源:互联网 发布:苹果软件定制 编辑:程序博客网 时间:2024/06/05 14:21

以前很少接触算法,没有遇到过这种问题,但是,在做美团、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 ] ]


0 0
原创粉丝点击