美团面试的两道算法题

美团的两道算法题

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

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

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值