前言
分享一道算法面试题。题目描述如下:
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法?
当然各种编程语言都是可以实现的。这里我们用C++语法去完成。这道题难度属于中等偏下,考验面试这的基本而已。考查面试者有没有递归思想,如果会递归写法,考官也会继续问有没有更好的解法。
思路如下:
/*
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路:先找规律,
n级台阶 :1 2 3 4 5 ...
对应跳法:1 2 3 5 8 ...
发现规律: S(n) = S(n-1) + S(n-2); S(2) = 2,S(1) = 1,S(0) = 0;
看是去用递归不错,代码很简洁直接使用规律S(n) = S(n-1) + S(n-2),但是递归 很耗费栈空间的(栈空间大小是有大小限制的),因为在函数未返回前所有的函数内的变量都被占用着;
直接用循环解法,时间复杂度干到O(n),空间复杂度为O(1)。
循环解法从1 2 3 5 8...循环从前往后累加即可,将前2位数据(num1 num2)相加的到结果赋值给num2,在赋值给num2前,需要把num2值赋值给num1,这样就达到了 S(n) = S(n-1) + S(n-2)了。
*/
实现代码
/*
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路:先找规律,
n级台阶 :1 2 3 4 5 ...
对应跳法:1 2 3 5 8 ...
发现规律: S(n) = S(n-1) + S(n-2); S(2) = 2,S(1) = 1,S(0) = 0;
看是去用递归不错,代码很简洁直接使用规律S(n) = S(n-1) + S(n-2),但是递归 很耗费栈空间的(栈空间大小是有大小限制的),因为在函数未返回前所有的函数内的变量都被占用着;
直接用循环解法,时间复杂度干到O(n),空间复杂度为O(1)。
循环解法从1 2 3 5 8...循环从前往后累加即可,将前2位数据(num1 num2)相加的到结果赋值给num2,在赋值给num2前,需要把num2值赋值给num1,这样就达到了 S(n) = S(n-1) + S(n-2)了。
*/
#include <iostream>
using namespace std;
class SolutionFlag {
public:
// 循环解法
int jumpFloor(int number) {
if (number <= 0) // 参数异常,直接返回0
return 0;
if (number <= 2) // 台阶数为1、2直接返回跳法数量
return number;
int num1 = 1,num2 = 2;
int count = 0; // n级台阶跳法数量
for (int i = 3; i <= number; i++)
{
count = num1 + num2;
num1 = num2;
num2 = count;
}
return count;
}
// 递归解法
int jumpFloor2(int number) {
if(number <= 0) // 参数异常,直接返回0
return 0;
if(number == 1 || number == 2)
return number;
return jumpFloor2(number-1) + jumpFloor2(number-2);
}
};
int main(int argc, char *argv[])
{
//1 2 3 5 8 13...
SolutionFlag flag;
cout << "---循环解法---" << endl;
cout << "flag.jumpFloor(1) " << flag.jumpFloor(1) << endl;
cout << "flag.jumpFloor(2) " << flag.jumpFloor(2) << endl;
cout << "flag.jumpFloor(3) " << flag.jumpFloor(3) << endl;
cout << "flag.jumpFloor(4) " << flag.jumpFloor(4) << endl;
cout << "flag.jumpFloor(5) " << flag.jumpFloor(5) << endl;
cout << "flag.jumpFloor(6) " << flag.jumpFloor(6) << endl;
cout << "---递归解法---" << endl;
cout << "flag.jumpFloor2(1) " << flag.jumpFloor2(1) << endl;
cout << "flag.jumpFloor2(2) " << flag.jumpFloor2(2) << endl;
cout << "flag.jumpFloor2(3) " << flag.jumpFloor2(3) << endl;
cout << "flag.jumpFloor2(4) " << flag.jumpFloor2(4) << endl;
cout << "flag.jumpFloor2(5) " << flag.jumpFloor2(5) << endl;
cout << "flag.jumpFloor2(6) " << flag.jumpFloor2(6) << endl;
return 0;
}