面试算法题:爬楼梯,N级楼梯有多少种走法?

【LintCode 题解】京东面试算法题:爬楼梯 题目描述 假设你正在爬楼梯,需要n步你才能到达顶部。但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部? Example 1: Input: n = 3 Output: 3 Explanation: 1) 1, 1, 1 2) 1, 2 3) 2, 1 total 3. Example 2: Input: n = 1 Output: 1 E... 阅读详情
By Long Luo

个人博客链接

最近去面试时,在一家小公司面试时,公司小BOSS给我出了一道算法题:

一个人爬楼梯,一步可以迈一级,二级,三级台阶,如果楼梯有N级,要求编写程序,求总共有多少种走法。

这个问题应该是一个很老的题目了,用中学数学来说,就是一个排列组合问题。当时拿到这个题目之后,首先想到使用递归的思想去解决这个问题:

N级楼梯问题可以划分为:N-1级楼梯,N-2级楼梯,N-3级楼梯的走法之和。

先计算下0,1,2,3及楼梯有多少种走法:

1 --> 1
2 --> 11 2
3 --> 111 12 21 3

那么,根据以上的分析很容易写出如下代码:

public static int countNumber(int stepsNum) {
    int sum = 0;

    if (stepsNum == 0) {
        return 0;
    }

    if (stepsNum == 1) {
        return 1;
    } else if (stepsNum == 2) {
        return 2;
    } else if (stepsNum == 3) {
        return 4;
    } else if (stepsNum > 3) {
        return countNumber(stepsNum - 3) + countNumber(stepsNum - 2)
                + countNumber(stepsNum - 1);
    }

    return sum;
}

public static void main(String[] args) {

    for (int i = 0; i <= 10; i++) {
        System.out.println("楼梯台阶数:" + i + ", 走法有:" + countNumber(i));
    }
}

再看看输出:

楼梯台阶数:0, 走法有:0
楼梯台阶数:1, 走法有:1
楼梯台阶数:2, 走法有:2
楼梯台阶数:3, 走法有:4
楼梯台阶数:4, 走法有:7
楼梯台阶数:5, 走法有:13
楼梯台阶数:6, 走法有:24
楼梯台阶数:7, 走法有:44
楼梯台阶数:8, 走法有:81
楼梯台阶数:9, 走法有:149

但是如何求解具体走法呢?

但是仅仅算出有多少种走法是很容易的,基于这个基础,如何输出具体的走法呢?

我们可以使用Stack数据结构和递归的思想去完成这个题目:

Stack<T>用于保存每一步的走法。

具体代码如下所示:

/**
 * 一个人爬楼梯,一步可以迈一级,二级,三级台阶,如果楼梯有N级,编写程序,输出所有走法。
 * 
 * @param args
 */
public static void main(String[] args) {
    Stack<Integer> stt = new Stack<Integer>();

    buileT(stt, 3);
}

public static void buileT(Stack<Integer> stt, int N) {
    if (N >= 1) {
        stt.push(1);
        buileT(stt, N - 1);
        stt.pop();
    }
    if (N >= 2) {
        stt.push(2);
        buileT(stt, N - 2);
        stt.pop();
    }
    if (N >= 3) {
        stt.push(3);
        buileT(stt, N - 3);
        stt.pop();
    }
    if (N == 0) {
        for (int i : stt) {
            System.out.print("Step:" + i + "-->");
        }
        System.out.println("完成");
    }
}
Created by Long Luo at 2015-04-08 00:40:12 @Shenzhen, China.
Completed By Long Luo at 2015-04-08 18:15:38 @Shenzhen, China.
js代码-假如你在爬楼梯,楼梯一共有N层,但你每次爬楼梯只能走一步或两步或三步,计算共有多少种走法?如何输出具体的走法呢? 立即下载

相关推荐

NVMe与PCIe的完美结合:高速存储背后的技术解析

本文深入解析了NVMe与PCIe技术如何完美结合,实现高速存储性能的飞跃。从机械硬盘到NVMe SSD的进化历程出发,详细介绍了PCIe总线的高带宽优势与NVMe协议的低延迟设计,以及两者协同工作带来的显著性能提升。通过实测数据对比,展示了NVMe SSD在消费级和企业级应用中的卓越表现,并提供了选购与优化建议。

weixin_29216353的博客 376

python爬楼梯动态规划算法,每次只能爬1,2,3阶,共n阶,输出具体所有组合方式,不是返回int值

假设你正在爬楼梯。需要n阶你才能到达楼顶。 每次你可以爬1或2个或者3个台阶。你有多少种不同的组合可以爬到楼顶呢?返回组合列表数组

zemarli549的博客 3636

对LSTM中每个batch都初始化隐含层的理解

不知道有没有人和我有一样疑惑 在LSTM相关的代码中,为什么每个batch都会将隐藏层重新初始化, 这样不会把以前训练出来的参数丢掉吗?? 比如 代码来自GitHub 看了一些解释是h与c是状态,不是参数,每个batch中都需要初始化为0,LSTM 中的参数是W,b。 网络中训练的是参数,不是状态。 说真的。。。当时我没怎么看懂。。。 咨询了实验室的师兄后,我有了自己的理解 产生误解的主要原因是我对RNN和LSTM的结构理解不深入,我们通常看到RNN结构图基本都是这样的 ...

Chauncey_Wang的博客 5910

经典动态规划问题:爬楼梯的多种解法详解

递归解法:简单直观,但效率低下。记忆化递归:通过存储中间结果优化了递归,但仍有递归深度限制。动态规划:时间复杂度和空间复杂度最优,适合大规模数据。组合数学:数学方法优雅,但需要理解组合数的计算逻辑。

m0_68705118的博客 1671

生物信息学新手必看:MAFFT多序列比对从安装到实战(附参数优化技巧)

本文为生物信息学新手提供了MAFFT多序列比对工具的完整指南。从Linux环境下的安装部署,到核心算法策略(如FFT-NS-i、L-INS-i)的选择逻辑,再到空位罚分等关键参数的深度解析与优化技巧,手把手教你完成从原始序列到高质量比对结果的实战流程,为后续进化树构建等分析奠定坚实基础。

weixin_29230773的博客 483

echarts实现折线图上下限区域展示

效果图: 画这种区域中主要是利用了series的两个属性: 思路:上下限都画上区域,然后折线利用图形透明度隐藏,给上区域加上颜色,给下区域加上白色(echarts图背景是啥色,就加啥色) lineStyle: { opacity: 0 }, // 图形透明度。支持从 0 到 1 的数字,为 0 时不绘制该图形 areaStyle: { color: 'rgba(0,122,255,0.1)' }, // 填充的颜色 我的需求是最大天数、最小天数、

小太阳的博客 1万+

五种解法搞定爬楼梯问题——力扣.爬楼梯

本文详细解析了LeetCode 70题"爬楼梯"的多种解法。题目要求计算爬到n阶楼梯的不同方法数,每次可爬1或2阶。核心思路是发现递推关系f(n)=f(n-1)+f(n-2),即斐波那契数列问题。文章从最基础的递归解法开始,逐步优化到记忆化递归、动态规划、空间优化(滚动数组)和数学公式解法,并对比了各方法的时间/空间复杂度。最终推荐使用O(1)空间的滚动数组解法,兼顾效率与简洁性。该问题是动态规划的经典入门题,掌握其思想对解决类似问题至关重要。

w1311823723的博客 1223

PT32F030与MT6826S SPI通讯实战:从硬件连接到数据交互全流程解析

本文详细解析了PT32F030与MT6826S通过SPI通讯的全流程,包括硬件连接、电路设计、SPI外设初始化配置以及数据交互协议实现。通过实战案例和代码示例,帮助开发者快速掌握PT32F030与MT6826S的SPI通讯技术,实现精准的角度和速度数据采集。

weixin_29189373的博客 420

Python-回溯法(爬楼梯)

问题:n阶楼梯,每次只能走一步或两步,输出所有方案 LeetCode有这道题不过是输出方案数,采用递归的方法,为了加深对回溯法了解,此处使用回溯法。 '''爬楼梯''' n = 7 # 楼梯阶数 x = [] # 一个解(长度不固定,1-2数组,表示该步走的台阶数) X = [] # 一组解 def climb_stairs(k): # 走第k步 global n, x, X i...

持续关注并分享目标检测、数据生成、视频驱动、跨模态、分割、关键点等领域前沿技术 1617

南邮-软件设计实验(C++版)

南邮软件设计 A档 一、分数统计 课题内容:   设计一个分数统计程序。包括学生信息的输入输出以及排序。通过该课题全面熟悉数组、字符串、文件的使用,掌握程序设计的基本方法及友好界面的设计。 课题要求: (1)输入某班级学生的姓名、分数; (2)对(1)的分数进行降幂排列并输出; (3)具有输入输出界面。 示例代码: #include<bits/stdc++.h> using...

Dainelcw 1万+

Unity AssetBundle 之 (入门)简单的资源打包成AB包的方法

Unity AssetBundle 之 (入门)简单的资源打包成AB包的方法 目录 Unity AssetBundle 之 (入门)简单的资源打包成AB包的方法 一、简单介绍 二、实现原理 三、注意事项 四、效果预览 五、实现步骤 六、关键代码 一、简单介绍 Unity中的一些基础知识点。 本节介绍,Asset Bundle 在 Unity中的使用,入门第一篇,如何AssetBundle标记,如何打包成AssetBundle的操作方法,有不对的地方欢迎指正。...

仙魁XAN 1万+

JAVA_上楼梯_爬楼梯 1 2 3

题目: 楼梯总共N阶,小明可以一次可以跨1步,2步,3步,请用递归求出小明总共有多少种跨法走完这个楼梯。 华为机试题: 恶心的考算法. 实例: 输入:4 输出4或者7 总梯数为4: 可能的走法. 1 1 1 1 1 1 2 1 2 1 1 3 2 2 2 1 1 3 1 上面为7中走法, 如果将 1 1 2 和1 2 1及 2 1 1看成相同的,则只有四种走法...

weixin_39917908的博客 1099

微信小程序报错:“errno“:600001,“errMsg“:“uploadFile:fail errcode:-105 cronet_error_code:-105 error_msg:net::

uploadFile:fail errcode:-105 cronet_error_code:-105 error_msg:net::ERR_NAME_NOT_RESOLVED,uniApp微信小程序使用uni.uploadFile出现报错,微信小程序如何解决wx.uploadFile报错,如何解决这个问题,微信小程序真机报错,微信小程序报错"errno":600001,"errMsg":"uploadFile:fail errcode:-105 cronet_error_code:-105 error_m

✅ 精选推荐文章 3825

Python面试宝典第5题:爬楼梯

小悦爬楼梯,一次只能上1级或者2级台阶。楼梯一共有n级台阶,请问总共有多少种方法可以爬上楼?

hope_wisdom的技术博客 1887

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【leetcode刷题】8.爬楼梯——Java版

糊涂算法,难得糊涂

公号:一条coding 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Rust面试宝典第1题:爬楼梯

通过这道题,我们学会了用递归算法和动态规划算法来编程处理问题。递归算法的时间复杂度较高,动态规划算法的时间复杂度较低。学习了上面的示例代码后,你真的理解递归算法和动态规划算法了吗?我们为你留了一些课后的拓展作业,快来试一试吧!1、小乐爬楼梯,一次只能上1级台阶,或者2级台阶,或者3级台阶。楼梯一共有n级台阶,请问总共有多少种方法可以爬上楼?2、有长宽分别为1x1和1x2的小格子,现在要用这两种小格子拼接成1xN的大格子。

hope_wisdom的技术博客 1620

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

程序设计与算法----递归之爬楼梯问题

爬楼梯 树老师爬楼梯,它可以每次走1级或者2级,输入楼梯的级数,求不同的走法数 例如:楼梯一共有3级,它可以每次都走一级,或者第一次走一级,第二次走两级,也可以第一次走两级,第二次走一级,一共有3种走法 输入 输入包含若干行,每行包含一个正整数N,代表楼梯级数,1<=N<=30 输出 不同的走法数,每一行输入对应一行 样例输入 5 8 10 样例输出 8 34 89 #include<iostream> using namespace std; #define MAXSIZE

Java硬件工程师的博客 2406

爬楼梯算法的数学思路

爬楼梯算法的数学思路 今日腾讯实习面试,问到一题算法。 爬楼梯问题:一个楼梯一共n个台阶,一次上1或者2个台阶。问,一共多少种解法。 这个问题,当时学递归的时候,我记得做过。但是已经一年半没写过递归和动态规划。所以,第一反应是用数学思路解决。 数学的想法是这样的: n已知 我们创建一个列表存放执行的步骤: 比如,有三个台阶。 **[1,1,1]**代表,我们每次走一个台阶,完成这个任务。 **[1...

shangjun2018的博客 4637

10-爬楼梯

用递归将问题分解为规模更小的子问题进行求解,用爬楼梯(也叫青蛙跳台阶)这个问题分析一下如何将问题规模变小,用递归求解,问题虽然很简单,但是很具有代表性。 1、问题描述 树老师爬楼梯,他可以每次走1级或者2级, 输入楼梯的级数,求一共有多少种走法。例如:楼梯一共有3级,他可以每次都走一级;或者第一次走一级,第二次走两级;也可以第一次走两级,第二次走一级,一共3种方法。 输入 输入包含若干行,每行包含...

桑凯旋的博客 405

《C++ 动态规划》第003题:使用最小花费爬楼梯

本文介绍了LeetCode第746题"使用最小花费爬楼梯"的两种动态规划解法。第一种解法以位置i为终点,定义dp[i]为到达i位置的最小花费,状态转移方程为dp[i]=min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2]),从左往右填表。第二种解法以位置i为起点,定义dp[i]为从i出发到终点的最小花费,状态转移方程为dp[i]=cost[i]+min(dp[i+1], dp[i+2]),从右往左填表。两种方法都给出了C++实现代码,时间复杂度均为O(n),空

心向往之,行必能至 1054

「图解大厂面试高频算法题」动态规划-爬楼梯

「图解大厂面试高频算法题」动态规划-爬楼梯 原题链接: https://leetcode-cn.com/problems/climbing-stairs/ 题目介绍 题目解答 寻找子问题 原问题可以等价转换为有多少种方法可以从第1个台阶爬到第N个台阶,这个问题可以拆成如下N个子问题 子问题1: 多少种方法可以从第1个台阶爬到第1个台阶 子问题2: 多少种方法可以从第1个台阶爬到第2个台阶 … … 子问题N-1: 多少种方法可以从第1个台阶爬到第N-1个台阶 很容易发现子问题为有多少种方法可以从第1个台

金刀的专栏 651

【算法每日一练及解题思路】有n级台阶,一次只能上1级或2级,共有多少种走法?

编程题:有n步台阶,一次只能上1步或2步,共有多少种走法? 1.递归 recursion 自己调自己,注意方法出口,频繁入栈出栈比较耗时,可能会导致栈溢出 2.迭代 iteration 比较高效 推导过程: n=1 [1] f(1)=1 n=2 [1,1] [2] f(2)=2 n=3 [1,1,1] [1,2] [2,1] f(3)=3 n=4 [1,1,1,1] [1,1,2] [1,2,1] [2,1,1] [2,2] f(4)=5 n=5 [1,1,1,1,1] [1,1,1,2] [1,1,2,1

Dylaniou的博客 440

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

这道题目和动态规划:斐波那契数题目基本是一样的,但是会发现本题相比动态规划:斐波那契数难多了,为什么呢?关键是动态规划:斐波那契数题目描述就已经把动规五部曲里的递归公式和如何初始化都给出来了,剩下几部曲也自然而然的推出来了。而本题,就需要逐个分析了,大家现在应该初步感受出关于动态规划,你该了解这些!里给出的动规五部曲了。简单题是用来掌握方法论的,例如昨天斐波那契的题目够简单了吧,但昨天和今天可以使用一套方法分析出来的,这就是方法论!

Lowjin_的博客 2715

算法题-爬楼梯【JS实现】

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。 输入: 3 输出: 3 解释: 有三种方法可以爬到楼顶。 1 阶 + 1 阶 + 1 阶 1 阶 + 2 阶 2 阶 + 1 阶 思路(方案): 数学公式法O(logn) 动态规划(O(n)) 题解 方案一: /** * @param {number} n * @return {number} */ var climbStairs = fu

CrystalLee 1069

爬楼梯问题, 求有多少种走法。 性能二次改良- 算法与数据结构面试分享(二十二)

题目:我们在上楼梯的时候,假设我们一次上一个台阶,也可以上两个台阶,如果现在有N个台阶,请问它有多少种走法?能帮我实现一个算法吗?很多同学拿到这道题的时候,想到的是数学问题。不过很多人不小心就陷入了排列组合,在N中求出1与2的组合可能有多少?按照这种思路估计就解不出来这道题了。要理解这道题得从下面两个方面入手: 什么叫走法?假设我们现在有3个台阶,它的走法有(1,1,1),(1,2),(2,1),...

gaoming 725

LintCode 爬楼梯

1.描述 假设你正在爬楼梯,需要n步你才能到达顶部。但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部? 样例 比如n=3,1+1+1=1+2=2+1=3,共有3种不同的方法 返回 3 2.分析 每到一层有多少种爬法取决于之前是如何爬上来的,由于一次只能爬一层或两层,因此状态转移方程为dp[i]=dp[i-1]+dp[i-2]。 3.代码 class Sol

Bloodyrabbits的博客 2386
上一篇: Google多线程面试题: 4个线程向4个文件里写入数据, 每个线程只能写一个值
下一篇: 10分钟掌握XML、JSON及其解析
tcpipstack
博客等级 码龄14年 329粉丝 89原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值