2012.9腾讯笔试题: 顺序输出到栈, 栈中元素可任意时刻出栈. 求输出序列的可能数

问题描述: n个不相同元素顺序输入到 一个栈, 栈可以里的元素可在任意时刻出栈. 求出栈的可能序列数. 


这是一个填空题, 求出当N等于5的情况的可能序列数. 很容易可以得到N等于2,3,4 时的序列数为 2,5,14. 这可通过在已有序列的基础上添加下一元素的可能性来寻找规律. 

当N为2时, 序列为 2,1 及 1,2. 当N为3时, 3可从2的序列中的最后插入, 第二个位置插入. 以及出现在2,1的前面. 如下图:



由此可得 当N为3时, 可能插入的位置为5, 即出栈序列的可能数 为 5. 再来看看当n为4时:



一共有14个位置可以插入. 共同的地方是最前只能插入一个, 最后及倒数第二个位置全都可以进行插入. 以及倒序输出的那个行的任意位置都可以进入插入. 此时, 输出的可能序列增加到了 14个. 那么当n为5 时, 可能输出的序列是多少个呢? 好吧, 我没找出规律来, 求解答. 

当然, 这个问题可以解决, 那就依靠我们强大的计算机吧. 

ruby代码如下:


a = [] #用来存放输出到栈中的数的
for i in 1 .. ARGV[0].to_i 
	a[i-1] = i
end
stack = []
printarray = [] #栈中输出先放至这个数组中, 满了就存放到vav中
vav = Array.new(){[]} #此也就是数组的数组, 存放合法的输出序列

def find(ith, stack, printarray, a, stack_push, vav)
	stack = Array.new stack
	printarray = Array.new printarray
	if ith == ARGV[0].to_i #若顺序输出完毕, 则栈中全部出栈, 存入打印数组中
		while !stack.empty?
			printarray.push stack.pop
		end
		vav.push printarray
	else
		if stack_push 
			stack.push a[ith]
			find(ith+1, stack, printarray, a, true, vav)
			find(ith+1, stack, printarray, a, false, vav)
		elsif !stack.empty?
			printarray.push stack.pop
			find(ith, stack, printarray, a, true, vav)
			find(ith, stack, printarray, a, false, vav)
		end
	end
end

find(0, stack, printarray, a, true, vav)
vav.uniq! #除去vav中的重复序列
vav.each{|i|
	p i
}
p vav.size
 

现在让我们来看来结果是什么, 首先先试一下  n 为3, 及 n 为 4 时. 如下:


结果是正确的, n 为5,6,7 时结果分别为: 42 , 132, 429.



posted @ 2012-09-25 21:04  樹下  阅读(477)  评论(0编辑  收藏  举报