美团面试的两道算法题

来源:互联网 发布:永无止境 知乎 编辑:程序博客网 时间:2024/06/05 21:08

美团的两道算法题

前天去美团面试,一面和二面问了各问了一道算法题,博主在这里和大家分享一下。

1.二叉树想必大家都了解,对于只有一个节点的二叉树,只会有一种结构,对于有两个节点的二叉树,那么会有2种可能的结构,那么问题来了,对于有n个节点的二叉树,一共有几种可能的情况?

当时直接就想列一下3,4,5个节点分别有多少种可能,然后看能不能找到规律,可是当去遍历4个节点时,发现遍历不住了,就放弃了。然后灵机一动,发现对于n个节点的二叉树,去掉根节点之后,会出现2个种情况。 
第一种 
一种是变成一颗n-1个节点的二叉树,这种情况存在两种可能。 
第二种 
另一种情况是,会变成一个a个节点的二叉树和一个b个节点的二叉树,a+b=n-1。 
这样很容易列出递推公式,问题就引刃而解了。 

F(n)=2F(n1)+k=1n2F(k)F(n1k)

上面公式可以优化一下,我们设F(0)=0,这样可以优化为 
F(n)=k=1n1F(k)F(n1k)

2.这个题目感觉挺新颖的,大意是我们令a-z对应数字1-26,这样我发送给你一串数字串比如123,然后进行解析会有abc,lc,aw这3种情况,然后你输出3表示有3种可能。那么问题就来了,我传给你一串数字串a1a2...an,然后你告诉我有多少种可能的情况。

这题目很明显是用动态规划来做,最开始我想法是用a[k][n]来表示ak...an的串有多少种可能性,那么递推公式为 

a[1][n]={n1k=1a[1][k]a[k+1][n]+1,n1k=1a[1][k]a[k+1][n]$,a[1][n]1-26

当时以为就解决了,可是发现在对123进行验证的时候发现有4种情况,最后发现原来是1,2,3这种情况重复了。简直心碎啊,当时时间紧迫,没有容我三思。不过面试完了之后,我继续研究这个问题,当天晚上就想出来了。用a[k]表示a1...ak子串有多少种可能的表示,我们可以发现,对于a[k1]来说,a[k]无非就是在后面加了一个数字ak,当akak1不能构成一个1-26的数字时,那么其实a[k]=a[k1],而当可以构成1-26的数字时,a[k]=a[k1]+a[k2].这样递推公式就是 

a[k]={a[k1],a[k1]+a[k2]akak11-26