剑指offer 面试题9 斐波那契数列/青蛙跳台阶/矩形覆盖/变态跳台阶

剑指offer 面试题9 斐波那契数列/青蛙跳台阶/矩形覆盖/变态跳台阶

题目:
题目一:
写一个函数,输入 n,求斐波那契 (Fibonacci)数列的第 n 项。斐波那契数列的定义如下:
f(n) = 0, n = 0
f(n) = 1, n = 1
f(n) = f(n-1) + f(n-2), n > 1

题目二:
一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级台阶。
求该青蛙跳上一个 n 级台阶总共有多少种跳发。

package algorithm.foroffer;

/**
 * Created by liyazhou on 2017/5/24.
 * 面试题9:斐波那契数列
 * 题目一:
 *      写一个函数,输入 n,求斐波那契 (Fibonacci)数列的第 n 项。斐波那契数列的定义如下:
 *          f(n) = 0,                   n = 0
 *          f(n) = 1,                   n = 1
 *          f(n) = f(n-1) + f(n-2),     n > 1
 *
 * 思路:
 *      1. 当 n = 0 或 1 时,返回 n
 *      2. 当 n > 1 时,返回前两项元素之和。使用循环实现
 *
 *
 * 题目二:
 *      一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级台阶。
 *      求该青蛙跳上一个 n 级台阶总共有多少种跳发。
 *
 * 思路:
 *      1. 本质就是斐波那契数列,使用递归思想解题
 *      2. 如果只有 1 级台阶,结果只有一种跳法;
 *         如果只有 2 级台阶,结果有两种跳法;
 *         如果台阶阶数为n,n 大于 2时,第一次跳有两种不同的选择,
 *         一是先跳一级台阶,则总的跳法数目为后面 n-1 级台阶的跳法数目;
 *         二是先跳二级台阶,则总的跳法数目为后面 n-2 级台阶的跳法数目
 */
public class Test09 {

    public static int fibonacciUsingRecursion(int n){
        // 递归终止条件
        if (n < 2) return n;
        // 递归操作,不能改变状态变量的数值
        return fibonacciUsingRecursion(n-1) + fibonacciUsingRecursion(n-2);
    }

    public static int fibonacci(int n){
        if (n < 0) throw new RuntimeException("Invalid input n");
        else if (n <=1 ) return n;

        int first = 0;
        int second = 1;
        int tmp = -1;
        for (int i = 1; i < n; i++){
            tmp = second;
            second = first + second;
            first = tmp;
        }
        return second;
    }

    public static void main(String[] args){
        for (int i = 0; i < 10; i++){
            System.out.println(String.format("fibonacci(%d) = %d", i, Test09.fibonacci(i)));
            System.out.println(String.format("fibonacci(%d) = %d", i, Test09.fibonacciUsingRecursion(i)));
        }
    }
}

青蛙跳台阶
2017-8-23 09:22:24

public class Solution {
    public int JumpFloor(int target) {
       if (target <= 2) return target;


       int first = 1;
       int second = 2;
       int temp = -1;
       for (int i = 3; i <= target; i ++){
           temp = first + second;
           first = second;
           second = temp;
       }
       return second;
    }
}

矩形覆盖
2017-8-23 09:44:16
题目描述:
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。
请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

public class Solution {
    public int RectCover(int target) {
       if (target <= 2) return target;

       int first = 1;
       int second = 2;
       int temp = -1;
       for (int i = 3; i <= target; i ++){
           temp = first + second;
           first = second;
           second = temp;
       }
       return second;
    }
}

变态跳台阶
2017-8-23 09:42:33

题目:
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

public class Solution {
    public int JumpFloorII(int target) {
        return (int)Math.pow(2, target-1);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值