面试题系列 (一) 算法

声明:所有题目均来自网络,非本人亲历试题,且本人不透露自己亲历面试笔试试题。
如若本文侵权,告知本人后我将立即删除。

泰波拿契數 (Tribonacci Number) 即把費波拿契數 (Fibonacci Number) 的概念推廣至三個數。
T 0 = 0, T 1 = T 2 = 1, T n     = T n-1 + T n-2 + T n-3

请你写一个算法,输入n,输出第n个Tribonacci数mod 2009的结果。

这个题目是众多名企的笔试面试题,据我所知,2009年微软海笔就出了这个题。另外据说google也出国这个题目。这个题目的好,好在于它有很好的区分度。

这个题目有三种解法。你采用什么算法,你的水平就一目了然了。

首先看第一种解法,也是最简单,最容易想到的。
递归法:代码如下:

采用递归的方法需要大量的重复计算。
经过测试,在ubuntu + gcc -o + p4 2.4GHz的机器上,100都需要算好久。
如果你采用这种算法的话,毫无疑问。你是不可能PASS笔试的。

算法二:采用递推的方法:
这种方法也很简单,头文件定义的宏已经在上面代码有了,函数代码如下:

采用递推的算法消除了很多重复计算,其时间复杂度是线性的,只扫描一遍O(n).
经测试,一百万以内的数字可以瞬间得到答案。1千万的话也能在1秒内得到解。但是超过1千万就不行了。
在笔试的时候,由于时间有限,其实能写到这个算法就应该可以勉强过笔试了。

第三种解法,矩阵法:
我们首先对算式做一个预处理:
Tn        = Tn-1 + Tn-2 + Tn-3
Tn+1     = Tn + Tn-1 + Tn-2
             
=Tn-1 + Tn-2 + Tn-3 + Tn-1 + Tn-2
            
= 2Tn-1 +2Tn-1 + Tn-2
Tn+2     = Tn+1 + Tn + Tn-1
          = 4Tn-1 +3Tn-1 + 2Tn-2
根据上面的变形,我们可以写成矩阵乘法的方式:

[Tn+2,          [ 4 , 3 , 2 ;       [Tn-1,
 Tn+1,     =     2 , 2 , 1;    *   Tn-2,
 Tn]                 1,  1 , 1]        Tn-3];

我们分别令三个矩阵为 C B A,则有  Cn+2 = B * An-1
因此Cn+5 = B * Cn+2 = B * B * An-1
依此类推 Cn + k = B ^ ([(k + 1) / 3]) * An-1    其中[]为向上取整
于是我们成功将模型转化为矩阵连乘了,而矩阵连乘是符合结合律的,因此我们可以二分求解.
算法复杂度转化为O(logn),具体代码如下:
code写得有点烂,多包涵

第三种方法是最完美的,但是代码量比较大,而且容易写错。在面试的时候倒是可以拿出来show一把自己的算法功底。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值