笔试中经常遇见的台阶问题(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。
针对不同的问题,需要设置不同的初始值和循环次数,所以分析问题的思路,仿照上面的程序写出相应的代码,不断的悟,自然就能轻而易举的解决这类问题的方案。
相关文章推荐
- Java笔试中遇见奇怪问题积累篇
- 关于java中是引用传递还是值传递的问题!!!经常在笔试中遇到,今天终于弄明白了!
- 魅族2016Java互联网方向其中一道笔试题--青蛙跳台阶问题
- [转] 应聘Java笔试时可能出现问题及其答案(第七部分)
- 应聘Java笔试时可能出现问题及其答案
- 有感:应聘Java笔试时可能出现问题及其答案
- Java的版本问题
- linux下安装java版本的问题
- [转] 应聘Java笔试时可能出现问题及其答案(第五部分)
- 应聘Java,jsp,j2ee软件工程师笔试中可能出现的问题
- 应聘Java笔试时可能出现问题及其答案
- [转] 应聘Java笔试时可能出现问题及其答案(第一部分)
- 应聘Java笔试时可能出现问题及其答案
- [转] 应聘Java笔试时可能出现问题及其答案(第二部分)
- [转] 应聘Java笔试时可能出现问题及其答案(第三部分)
- 应聘Java笔试时可能出现问题及其答案
- linux下安装java版本的问题
- 面试时最经常被问到的问题(Frenquently asked interview questions)之Java篇
- 有感:应聘Java笔试时可能出现问题及其答案(第二版Part one)
- 应聘Java笔试时可能出现问题(答案不一定正确)