zoukankan      html  css  js  c++  java
  • C#版

    面试题9:斐波那契数列及其变形(跳台阶、矩形覆盖)

    提交网址: http://www.nowcoder.com/practice/c6c7742f5ba7442aada113136ddea0c3?tpId=13&tqId=11160

    参与人数:7267  时间限制:1秒  空间限制:32768K

    题目描述

    大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项 Fibonacci(int n)。

    分析:

    用递归会TLE,因为有不少地方进行了重复计算,改为循环即可解决(迭代法)...

    另外为了避免输入非法值(比如负数),输入改为了unsigned int

    (fib(n)=egin{cases} 1 &  n=0 \
     1 & n=1 \ 
     fib(n)+f(n-1) & n > 1   and  n in N end{cases})

    AC代码:

    class Solution {
    public:
        int Fibonacci(unsigned int n) {
    
            int arr[2]={0,1};
            if(n<2) return arr[n];
            
            long long fib_2preN=0;      // fib(0)
            long long fib_1preN=1;      // fib(1)
            long long fib_N=0;
            
            for(int idx=2; idx <= n; idx++)
            {
                fib_N=fib_2preN+fib_1preN;
                fib_2preN=fib_1preN;
                fib_1preN=fib_N;
            }
            return fib_N;
        }
    };

    剑指offer 面试题9 变形1(跳台阶)


    提交网址: http://www.nowcoder.com/practice/8c82a5b80378478f9484d87d1c5f12a4?tpId=13&tqId=11161

    题目描述:

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

    输入:

    输入可能包含多个测试样例,对于每个测试案例,

    输入包括一个整数n(1<=n<=70)。

    输出:

    对应每个测试案例,

    输出该青蛙跳上一个n级的台阶总共有多少种跳法。

    样例输入:

    5

    样例输出:

    8

    分析:

    青蛙跳上n级台阶的跳法情况( s(n) ),第1次跳的时候有两种选择: 
    (1) 如果第1次跳时选择跳过1级台阶,那么还剩下n - 1级台阶,而跳上n – 1级台阶的跳法数目是s(n - 1); 
    (2) 如果第1次跳时选择跳过2级台阶,那么剩下n - 2级台阶,而跳上n – 2级台阶的跳法数目是s(n - 2)。 

    (s(n)=egin{cases} 1 &  n=1 \
     1 & n=2 \ 
     s(n)+s(n-1) & n > 2   and  n in N end{cases})

    如果使用递归,会TLE超时,此处还是需要用迭代法...

    AC代码:

    class Solution {
    public:
        int  jumpFloor(int n) {
            if(n<0) return 0;
    
            if(n==1) return 1;
            if(n==2) return 2;
            
            long long s_2preN=1;      // s(1)
            long long s_1preN=2;      // s(2)
            long long s_N=1;
            
            for(int idx=3; idx <= n; idx++)
            {
                s_N=s_2preN+s_1preN;
                s_2preN=s_1preN;
                s_1preN=s_N;
            }
            return s_N;
        }
    };

    leetcode 70. Climbing Stairs

    提交网址: https://leetcode.com/problems/climbing-stairs/

    这有个奇怪的要求,n<0时,返回1

    class Solution {
    public:
        int climbStairs(int n) {
            if(n<0) return 1;
    
            if(n==1) return 1;
            if(n==2) return 2;
            
            long long s_2preN=1;      // s(1)
            long long s_1preN=2;      // s(2)
            long long s_N=1;
            
            for(int idx=3; idx <= n; idx++)
            {
                s_N=s_2preN+s_1preN;
                s_2preN=s_1preN;
                s_1preN=s_N;
            }
            return s_N;
        }
    };

    剑指offer 面试题9 变形2(变态跳台阶)

    提交网址: http://www.nowcoder.com/practice/22243d016f6b47f2a6928b4313c85387?tpId=13&tqId=11162

    题目描述:

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

    输入:

    输入可能包含多个测试样例,对于每个测试案例,

    输入包括一个整数n(1<=n<=50)。

    输出:

    对应每个测试案例,

    输出该青蛙跳上一个n级的台阶总共有多少种跳法。

    样例输入:

    6

    样例输出:

    32

    分析:

    青蛙跳上n级台阶的跳法情况(s(n)),第1次跳的时候: 
    (1) 如果第1次跳时选择跳过1级台阶,那么还剩下n-1级台阶,而跳上n – 1级台阶的跳法数目是s(n-1); 
    (2) 如果第1次跳时选择跳过2级台阶,那么剩下n-2级台阶,而跳上n – 2级台阶的跳法数目是s(n-2)。 
    (3) 如果第1次跳时选择跳过3级台阶,剩下n-3台阶, 而跳上n –3级台阶的跳法数目是s(n-3)。 
    ……

    故总数为s(n) = s(n-1) + s(n-2) + … + s(2) + s(1) + s(0) . 
    s(n-1)= s(n-2) + … + s(2) + s(1) + s(0) 
    两式相减得: 
    s(n) =2*s(n-1) 
    s(1)=1 
    对于s(0),由s(2)=s(1)+s(0)=2可得s(0)=1.  


    (s(n)=egin{cases} 1 &  n=0 \
     1 & n=1 \ 
     2cdot s(n) & n > 1   and  n in N end{cases})

    依旧需要用迭代法...

    AC代码:

    class Solution {
    public:
        int  jumpFloorII(int n) {
            if(n<0) return 0;
    
            if(n==0 || n==1) return 1;
            
            long long s_N=1; // s(1)
            
            for(int idx=2; idx <= n; idx++)
            {
                s_N=2*s_N;
            }
            return s_N;
        }
    };

    剑指offer 面试题9(变形3) 矩形覆盖

    提交网址:  http://www.nowcoder.com/practice/72a5a919508a4251859fb2cfb987a0e6?tpId=13&tqId=11163

    题目描述:

    我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

    输入:

    输入可能包含多个测试样例,对于每个测试案例,

    输入包括一个整数n(0<=n<=70)。

    输出:

    对应每个测试案例,

    输出用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有的方法数。

    样例输入:

    4

    样例输出:

    5

    分析: 
    2*n的覆盖方法情况总数为 f(n),假设2*n的大矩形高度为2(躺着放),当第一个2*1小矩形放在最左边的角落时: 
    (1) 如果第一个2*1小矩形选择竖着放,那么还剩下2*n-1的区域,而2*n-1区域的覆盖数目是f(n-1); 
    (2) 如果第一个2*1小矩形选择横着放,那么上面必须再放一个2*1小矩形,同时还剩下2*n - 2区域,而2*n-2区域的覆盖数目是f(n-2);

    所以总数为f(n) = f(n-1) + f(n-2) . 
    f(1)=1 
    对于f(0),由f(2)=f(1)+f(0)=2可知 f(0)=1. 

    (f(n)=egin{cases} 1 &  n=0 \
     1 & n=1 \ 
     f(n)+f(n-1) & n > 1   and  n in N end{cases})

    AC代码:

    class Solution {
    public:
       int rectCover(int number) {
            if(number<0) return 0; //  if(number<0 || number%2) return 0; 不需要考虑奇偶
            if(number==0 || number==1) return 1;
            
            long long f_2preN=1;    // f(0)  
            long long f_1preN=1;    // f(1) 
            long long f_N=1;
            
            for(int idx=2; idx <= number; idx++)
            {
                f_N=f_2preN+f_1preN;
                f_2preN=f_1preN;
                f_1preN=f_N;
            }
            return f_N;
        }
    };
  • 相关阅读:
    react入门教程 |菜鸟教程
    React 组件构造方法: ES5 (createClass) 还是 ES6 (class)?
    代码设置LinearLayout的高度
    android调用webservice发送header身份验证不成功
    GridView中item获得焦点放大缩小
    关于url从服务器上获取图片资源
    Android中删除照片操作
    android采用Ksoap2访问webservice,AndroidHttpTransport call方法异常
    创建新的Android项目,Eclipse自动创建的appcompat内容
    Windroy、Windroye、Bluestacks运行Android实现原理
  • 原文地址:https://www.cnblogs.com/enjoy233/p/10408861.html
Copyright © 2011-2022 走看看