笔试算法:青蛙跳台阶

2023-05-16

笔试算法:青蛙跳台阶

1、题目表述

//假设青蛙正在跳台阶。需要 n 阶你能到达楼顶。
//每次青蛙可以跳 1 或 2 个台阶,但不可以连续跳2个。请问有多少种不同的方法可以到楼顶呢?
//注意:给定 n 是一个正整数。

2、解析

从题目描述中我们可以发现,每次只能跳1或2个台阶,即当我们到达楼顶前的最后一次也是跳了1或2个台阶。 用公式表示为:

f ( x ) = f ( x − 1 ) + f ( x − 2 ) f(x)=f(x-1)+f(x-2) f(x)=f(x1)+f(x2)其中:f(x)表示青蛙到达x级台阶的方法数量
f(x-1)表示青蛙跳了一个台阶到达x级台阶
f(x-2)表示青蛙跳了两个台阶到达x级台阶
那么我们便可以采用递归或者动态规划的方式计算n阶台阶到达楼顶的方法数量。

3、代码

递归

int ClimbStairs(int n)
{
	if (n <= 2)
		return n;
	return ClimbStairs(n - 1) + ClimbStairs(n - 2);
}

动态规划

int climbStairs(int n) {
        if (n <= 1) return 1;
        int f[n + 1];
        f[0] = 1;
        f[1] = 1;
        f[2] = 2;
        for (int i = 3; i <= n; i++)
            f[i] = f[i - 1] + f[i - 3];
        return f[n];
    }

4、题目升级

在题目的基础上加了一个小限制,青蛙每次可以跳1或2个台阶,但是青蛙不能连续跳2个台阶,求青蛙到达n级台阶的方法数?

5、分析

不能连续跳2个台阶,也就是说如果一次跳了2个台阶,下一次只能跳1个台阶。
假设f(x)表示当前跳到了x级台阶
g(x,1)表示当前跳到了x级台阶并且上一步跳了1级台阶
g(x,2)表示当前跳到了x级台阶并且上一步跳了2级台阶
那么同理可得:
f ( x ) = g ( x , 1 ) + g ( x , 2 ) f(x)=g(x,1)+g(x,2) f(x)=g(x,1)+g(x,2)
因为g(x-1):只跳1级台阶到x级,等价于f(x-1):x-1级台阶跳1级到x级,那么:
g ( x , 1 ) = f ( x − 1 ) g(x,1)=f(x-1) g(x,1)=f(x1)
因为跳到x级跳了2个台阶,那么上一次只能跳一个台阶,那么:
g ( x , 2 ) = g ( x − 2 , 1 ) g(x,2)=g(x-2,1) g(x,2)=g(x2,1)
由f(x-1)=g(x,1)得到
g ( x − 2 , 1 ) = f ( x − 3 ) g(x-2,1)=f(x-3) g(x2,1)=f(x3)
所以:
f ( x ) = g ( x , 1 ) + g ( x , 2 ) = f ( x − 1 ) + f ( x − 3 ) f(x)=g(x,1)+g(x,2)=f(x-1)+f(x-3) f(x)=g(x,1)+g(x,2)=f(x1)+f(x3)
因此,经过以上分析,该方法也就同样归结为动态规划

6、代码

递归

int ClimbStairs(int n)
{
	if (n == 0) return 1;
	if (n == 2||n==1)
		return n;
	return ClimbStairs(n - 1) + ClimbStairs(n - 3);
}

动态规划

int ClimbStarirs(int n)
{
	if (n <= 1) return 1;
	vector<int> f(n+1,-1);
	f[0] = 1;
	f[1] = 1;
	f[2] = 2;
	for (int i = 3; i <= n; i++)
		f[i] = f[i - 1] + f[i - 3];
	return f[n];
}

7、总结

以上就是青蛙跳台阶的所有内容,涉及到十分重要的动态规划问题,也是大厂笔试的常考题,早已在完美世界、字节跳动和leetcode等的算法题中出现过类似题型,值得重视。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

笔试算法:青蛙跳台阶 的相关文章

随机推荐

  • Ubuntu修改文件权限

    修改文件权限 xff1a chmod chmod 修改文件权限有两种使用格式 xff1a 字母法与数字法 给文件的同组用户和其他用户减去读权限 ps 只能对自己的文件进行权限操作 增加读写权限 设置文件所有者的权限为读 修改文件所有者 xf
  • PyQGIS中一次性加载多个shp文件

    目录 遍历添加多个图层 打印图层列表清单 打开QGIS Desktop 3 22 16 xff0c 点击菜单栏 设置 gt Python控制台 在Python控制台中点击 显示编辑器 按钮 xff0c 打开Python编辑器 点击Pytho
  • PyQGIS获取要素以及要素中的几何属性

    from qgis core import QgsProject QgsVectorLayer 1 指定输入图层路径 path to airports layer 61 r 34 E PyQGIS Source Data Ex5 pt sh
  • 【解决思路】当前不会命中断点,还未为文档加载任何符号

    问题 xff1a 在调试代码过程中 xff0c 计算机突然蓝屏而强制关闭并重启 xff0c 以至于vs在运行调试的过程中就在非正常的情况下被迫关闭 重启之后 xff0c 继续打开并运行项目 xff0c 却发现无法进行调试代码 于是我把鼠标移
  • PyQGIS获取字段列表

    from qgis core import QgsVectorLayer QgsProject path to airports layer 61 r 34 E PyQGIS Source Data Ex5 pt shp 34 layer
  • 【用示例学习与理解C++系列】类的构造方法

    前言 本文主要是通过简单的示例 xff0c 去学习与理解C 43 43 类的构造方法 构造方法的作用 为什么存在构造方法 xff1f 为什么需要构造方法 xff1f 那是因为当我们在代码中定义一类变量 xff08 实例化一个类的实例 对象时
  • CSP-M2 :神奇的序列

    文章目录 HRZ的序列题目输入输出解题代码 HRZ学英语 滑动窗口题目输入输出解题代码 咕咕东的奇妙序列题目输入输出解题代码 HRZ的序列 题目 相较于咕咕东 xff0c 瑞神是个起早贪黑的好孩子 xff0c 今天早上瑞神起得很早 xff0
  • 转化Foggy_Cityscapes数据集为voc和yolo格式用作目标检测

    目录 一 数据集下载 xff08 1 xff09 解压后文件夹目录 xff08 2 xff09 gtFine格式如下所示 xff1a 二 转换为VOC数据集格式 xff08 1 xff09 生成xml标签 xff08 2 xff09 将le
  • 如何获取数据库的逻辑文件名、数据库文件的路径

    1 sp helpdb 数据库名 2 获取数据库文件路径 select ltrim rtrim filename from 数据库名 sysfiles where charindex 39 MDF 39 filename gt 0 sele
  • Linux进度条以及makefile相关知识

    一 在Linux环境下实现进度条 xff0c 其原理是 xff1a 用sleep函数或usleep函数控制每隔多长时间输出一次 xff0c 每次输出字符会比上次输出字符多一个 在此代码中 xff0c 用 r而不用 n的原因 xff1a n表
  • hdu - 4642 - Fliping game(博弈)

    题意 xff1a Alice和Bob玩游戏 xff0c 一个N M的矩阵 xff0c 里面是1或0 xff0c 每人每次选择一个1的位置 xff0c 然后将这个位置到右下角的整个矩形元素全部取反 xff08 1变0 xff0c 0变1 xf
  • 图形界面报错“已拒绝X11转移申请”的解决方法

    今天想通过本机给虚拟机起x manager图形界面的时候报出 解决办法 xff1a 原来X11 forwarding依赖 xorg x11 xauth 软件包 xff0c 所以必须先安装 xorg x11 xauth 软件包 yum ins
  • bash: ifconfig: command not found 解决办法

    经常遇到 34 bash xxxx command not found 34 这样的问题 xff0c 用root用户也不行 xff0c 在网上查阅了此问题 xff0c 解决方法如下 xff1a 原文1 http hi baidu com j
  • 用CMfcShellTree和CMFCShellListCtrl实现资源管理器并过滤扩展名

    资源管理器 CMfcShellTree和CMFCShellListCtrl是VS2008 SP1和VS2010内自带的控件 xff0c 用这两个控件实现资源管理器只需几行代码 CMFCShellTreeCtrl m tree CMyShel
  • 解决虚拟机下CentOS系统无法识别usb设备

    其实不是什么 解决 xff0c 虚拟机默认是自动挂载usb设备的 只是要注意插usb设备的时候 xff0c 虚拟机必须要处于当前窗口 然后就会自动弹出已安装好usb设备的提示 xff08 如果系统比较卡 xff0c 需要多等一会 xff09
  • 基于MDK的汇编语言编写及小灯闪烁的汇编程序实现

    基于MDK的STM32汇编语言编写及小灯闪烁的汇编程序实现 一 新建工程二 配置环境1 选择设备2 选择运行环境3 添加源文件 三 测试代码1 源码2 仿真器设置3 编译调试 四 HEX文件解读五 闪烁LED的程序六 总结参考 一 新建工程
  • WIndows10连接虚拟机显示connection confused

    Windows10连接虚拟机显示connection confused 当我们想由win10连接虚拟机终端时 xff0c 使用第三方软件Putty或者win10的cmd都可能出现connection confused问题 xff0c 解决这
  • 交换两个数字(不使用其他变量)

    面试题 交换两个数字 xff08 不使用其他变量 xff09 一 题目要求 xff1a 有两个整数变量a 61 6 b 61 100不使用其他变量 xff0c 交换两个变量的值 二 解法 解法1 xff08 使用其他变量 xff09 xff
  • unity如何使用电脑模拟VR环境

    unity如何通过VRTK模拟VR环境 如何在没有HTC VIVE的前提下使用VR xff1f 由于作者研究室课题是基于虚拟现实的人机交互 xff0c 需要用到VR下的场景 xff0c 但由于实验室设备只有一套 xff0c 而当我们想要随时
  • 笔试算法:青蛙跳台阶

    笔试算法 xff1a 青蛙跳台阶 1 题目表述 假设青蛙正在跳台阶 需要 n 阶你能到达楼顶 每次青蛙可以跳 1 或 2 个台阶 xff0c 但不可以连续跳2个 请问有多少种不同的方法可以到楼顶呢 xff1f 注意 xff1a 给定 n 是