[面试]算法题走楼梯

题目

假设楼梯有n层高,每次只能走一步或者两步,求有多少种走法
思路一:
计算过程就是方法,层数作为参数,声明方法f(x)。根据情况分析
一层:1种方法 f(1) = 1
二层:2种方法f(2) = 2
三层:先到达f(1),然后从f(1)跨两步,或者先到达f(2),从f(2)跨一步,f(3) = f(1) + f(2)
四层:先到达f(2),然后从f(2)跨两步,或者先到达f(3),从f(3)跨一步,f(4) = f(2) + f(3)
n层:先到达f(n-2),然后从f(n-2)跨两步,或者先到达f(n-1),从f(n-1)跨一步,f(n) = f(n-2) + f(n-1)
通俗点说,每走到第n层,分两种情况,要么是从第n-1层走一步上来的,要么就是从第n-2层走两步上来的。那么第n层的全部走法就是n-1层全部走法加上n-2层全部走法
使用递归解决,代码如下:

public class Demo4 {

    public static int f(int n) {
        if (n == 1 || n == 2) {
            return n;
        }
        return f(n - 2) + f(n - 1);
    }

    @Test
    public void test() {
        long start = System.currentTimeMillis();
        int f = f(40);
        System.out.println("总共走法:" + f);
        long end = System.currentTimeMillis();
        System.out.println(String.format("用时:%sms",  (end - start)));
    }
}

运行结果

总共走法:165580141
用时:321ms

递归有大量重复运算,占用资源高,效率较低

思路二:
在思路一的基础上进行改善,已知第n层的走法就是n-1层加上n-2层的总走法。那么使用循环,并且记录n-1层和n-2层的总走法即可,代码如下:

public class Demo4 {

    public static int f1(int n) {
        if (n == 1 || n == 2) {
            return n;
        }
        // 假设从第三层开始
        int n1 = 2; // n-1层总走法
        int n2 = 1; // n-2层总走法
        // 开始计算
        int sum = 0; // 记录总走法
        for(int i =3; i<=n;i++) {
            sum = n1 + n2;
            n2 = n1; // 本层n-1的走法就是下一层n-2的走法
            n1 = sum; // 本层n全部走法就是下一层n-1的走法
        }
        return sum;
    }

    @Test
    public void test() {
        long start = System.currentTimeMillis();
        int f = f1(40);
        System.out.println("总共走法:" + f);
        long end = System.currentTimeMillis();
        System.out.println(String.format("用时:%sms",  (end - start)));
    }
}

运行结果

总共走法:165580141
用时:0ms

可以看出,效率比递归高的多

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值