C++面试题-青蛙跳台阶的2种解法

前言

分享一道算法面试题。题目描述如下:

一只青蛙一次可以跳上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;
}

结果验证

在这里插入图片描述

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页