您的位置:首页 > 编程语言 > Java开发

笔试中经常遇见的台阶问题(java版本)

2015-04-08 12:29 190 查看

笔试中经常会出现这样类型的单选题目

一只青蛙,跳上台阶,一次可以跳一阶,或者一次跳两阶,问跳跃50阶台阶有多少种跳法?
一只猴子,摘香蕉,一次可以摘一个,或者一次摘两个,问摘50个香蕉有多少种摘法?

相信,很多ACMer看见这种问题,直接就能够列出式子,这不就是斐波那契数列嘛。

分析过程如下:
如果只有一级台阶,那么只有一种跳法。
如果有两级台阶,那么就有两种跳的方法了:一种是分两次跳,一次跳一级,另外一种就是一次跳两级。
一般情况,我们把n级台阶看作是n的函数,记作f(n)。当n>2时,第一次跳的时候就有两种选择:一是第一次只跳1级,此时跳法数目等于后面剩下的n-1级台阶的跳法数目,即f(n-1);另外一种就是第一次跳两级,此时跳法数目等于后面剩下的n-2级台阶的跳法数目,即为f(n-2)。因此n级台阶时的不同跳法的总数f(n)= f(n-1) + f(n-2),这样一直不停的递归下去就可以得到最后的结果,分析到这里很多人都能看出这就是Fibonacci数列了。但很多书上求解的代码都是这么写的:
public long JumpFloor(long target) {

if(target==1)
return 1;
if(target==2)
return 2;

return JumpFloor(target -1 ) + JumpFloor(target - 2);
}


这么写,当然是可以的,但是你去那这个方法跑程序的时候,会发现50阶台阶跑起来,基本上个把小时把,因为数学符号表达式和真正的计算解题是有区别的,数学要求的是严谨和见解的表达,而计算科学则需要尽量快的得出结果,好的数学公式未必是好的计算公式,所以实际的解题代码如下:
public long JumpFloor(long target) {

if(target==1)
return 1;
if(target==2)
return 2;

long a = 2;
long b = 1;
long sum = 0;
for(long i=3;i<=target;i++){
sum = a + b;
b = a;
a = sum;
}
return sum;
}
以上便是如何求n的过程,注意这里我选择的数据类型是long,因为如果选择int,台阶较多的时候会产生溢出,结果是20365011074。
针对不同的问题,需要设置不同的初始值和循环次数,所以分析问题的思路,仿照上面的程序写出相应的代码,不断的悟,自然就能轻而易举的解决这类问题的方案。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: