C++面试宝典第1题:爬楼梯

news2025/1/13 10:04:58

题目

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

解析

        这道题虽然是一道编程题,但实际上更是一道数学题,着重考察应聘者的逻辑思维能力和分析解决问题的能力。

        当楼梯只有1级时,只有1种方法可以上楼。

        当楼梯有2级时,有两种方法可以上楼:一次跨1级,或者一次跨2级。

        对于大于2级的楼梯,我们可以选择从第n-1级跨1级,或者从第n-2级跨2级。所以,对于n级楼梯的方法数为:f(n) = f(n-1) + f(n-2)。

        这种思考问题的方法就是递归的思想。下面,我们给出了用递归函数求解这道题的示例代码。

#include <iostream>
using namespace std;

unsigned int CalcUpstairsCount(unsigned int uiSteps)
{
    if (uiSteps <= 2)
    {
        return uiSteps;
    }

    return CalcUpstairsCount(uiSteps - 1) + CalcUpstairsCount(uiSteps - 2);
}

int main()
{
    cout << CalcUpstairsCount(0) << endl;
    cout << CalcUpstairsCount(1) << endl;
    cout << CalcUpstairsCount(2) << endl;
    cout << CalcUpstairsCount(3) << endl;
    cout << CalcUpstairsCount(4) << endl;
    cout << CalcUpstairsCount(5) << endl;
    getchar();
    return 0;
}

        可以看到,采用递归实现的代码非常简洁。但递归算法也有其缺点:一是递归的层级较多时,可能会导致堆栈溢出;二是递归算法的时间复杂度一般较高,效率较低。具体到本题,因为每次递归都可能产生两种选择,故时间复杂度为O(2^n)。计算n级台阶和n-1级台阶的方法数时,都会去计算n-2级台阶的方法数,从而导致大量的重复计算。

        有没有更好的解决问题的方法呢?答案是肯定的,我们可以通过动态规划算法来尝试一下。

        我们可以使用一个数组dp来存储每级楼梯的方法数,初始条件为:dp[1] = 1, dp[2] = 2。

        对于大于2级的楼梯,我们可以从第n-1级跨1级到达第n级,或者从第n-2级跨2级到达第n级。所以,dp[n] = dp[n-1] + dp[n-2]。

        这样,我们可以通过一次遍历,计算出所有楼梯级数的方法数。这种方法的时间复杂度为O(n),空间复杂度也为O(n)。下面,我们给出了用动态规划算法求解这道题的示例代码。

#include <iostream>
#include <vector>
using namespace std;

unsigned int CalcUpstairsCount(unsigned int uiSteps)
{
    if (uiSteps <= 2)
    {
        return uiSteps;
    }

    // 为了方便理解,第0个元素未使用
    vector<int> vctCount(uiSteps + 1, 0);
    vctCount[1] = 1;
    vctCount[2] = 2;
    for (unsigned int i = 3; i <= uiSteps; i++)
    {
        vctCount[i] = vctCount[i - 1] + vctCount[i - 2];
    }

    return vctCount[uiSteps];
}

int main()
{
    cout << CalcUpstairsCount(0) << endl;
    cout << CalcUpstairsCount(1) << endl;
    cout << CalcUpstairsCount(2) << endl;
    cout << CalcUpstairsCount(3) << endl;
    cout << CalcUpstairsCount(4) << endl;
    cout << CalcUpstairsCount(5) << endl;
    getchar();
    return 0;
}

总结

        通过这道题,我们学会了用递归算法和动态规划算法来编程处理问题。递归算法的时间复杂度较高,动态规划算法的时间复杂度较低。

        学习了上面的示例代码后,你真的理解递归算法和动态规划算法了吗?我们为你留了一些课后的拓展作业,快来试一试吧!

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

        2、有长宽分别为1x1和1x2的小格子,现在要用这两种小格子拼接成1xN的大格子。请编写一个方法来计算一共有多少种拼接方案,N作为方法的唯一参数,返回值为拼接方案数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1281636.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

严蔚敏数据结构p17(2.19)——p18(2.24) (c语言代码实现)

2.19已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写一高效的算法, 删除表中所有值大于 mink 且小于 maxk 的元素(若表中存在这样的元素&#xff09;同时释放被删结点空间, 并分析你的算法的时间复杂度(注意:mink 和 maxk 是给定的个参变量,它们的值可以和表中…

QNX时钟调研

SYSPAGE_ENTRY()的使用&#xff0c;SYSPAGE_ENTRY 测试QNX下printf(“poo\n”);的耗时 #include <sys/neutrino.h> #include <inttypes.h> #include <stdio.h> #include <stdlib.h> #include <sys/syspage.h>int main( void ) {uint64_t cps, …

P7 链表 链表头前方插入新节点

目录 前言 01 链表头插入数据 示例代码 02 指定节点前方插入新节点 测试代码 前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C》✨✨✨ &#x1f525; 推荐专栏2: 《 Linux C应用编程&#xff08;概念类&#xff09;_ChenPi的博客-CSDN博客》✨…

Linux系统配置深度学习环境之cudnn安装

前言 一个针对深度学习应用优化的 GPU 加速库。它提供了高性能、高可靠性的加速算法&#xff0c;旨在加速深度神经网络模型的训练和推理过程。 cuDNN 提供了一系列优化的基本算法和函数&#xff0c;包括卷积、池化、规范化、激活函数等&#xff0c;以及针对深度学习任务的高级功…

【MySQL的DQL查询语句】

MySQL的DQL查询语句-----在Navicat下 将学生表导入Navicat中查询语句查询一整张表查询年龄大于22年龄大于22的女生查找文科的学生查找六班的学生计算学生的总分 &#xff08;group by&#xff09;合并两表 &#xff08;join on xxxx&#xff09;合并两张表 并求总分先合并在聚合…

一站式自动化:Ansible Playbook的全面学习之旅

1 Playbook介绍 1.1 Playbook介绍 playbook 是由一个或多个play组成的列表 Playbook 文件使用YAML来写的 1.2 YAML 1.2.1 介绍 是一种表达资料序列的格式&#xff0c;类似XML Yet Another Markup Language 2001年首次发表 www.yaml.org 1.2.2 特点 可读性好 和脚本语言交…

机器学习笔记 - 什么是模型量化压缩技术?

一、简述 我们都知道现实世界是连续的状态,而计算机世界是离散的状态,这是什么意思呢?我们看一下下图,最右边的马力欧(高清)的状态,可以想象现实世界是连续的状态,而电脑世界在图像上呈现的是一格一格子的状态(左图)是离散的状态。 所以在计算机世界如果想要…

医疗器械设备模组的具体应用

直线模组是一种高精度、高速度的精密传动元件&#xff0c;目前被广泛应用在各种工业自动化领域&#xff1b;尤其是在激光加工、电子制造、医疗设备、物流设备和机器人等行业中&#xff0c;都发挥着重要作用&#xff0c;接下来我们看看医疗器械设备模组的具体应用吧&#xff01;…

智慧灯杆系统平台架构设计需要考虑的几个要点

智慧灯杆是一种集成了各种先进技术的道路照明设施。它不仅提供照明服务&#xff0c;还可以具有物联网技术、视频监控、环境监测、广播通讯、无线网络覆盖等多种功能。这些智能功能可以通过互联网进行控制和管理&#xff0c;从而实现智慧城市的建设。智慧灯杆能够提升城市的智能…

Webgis学习总结

前言&#xff1a; 作者跟随视频学习了webgis内容进行如下学习复习总结 参考&#xff1a;新中地学习笔记 WebGIS第一课&#xff1a;测试高德API并通过&#xff1a; 注册申请高德API成为开发者&#xff0c;创建自己的项目和key进行项目初始化&#xff0c;可以使用JS API官方文…

PyQt6 QComboBox下拉组合框控件

​锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计34条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话…

算法基础--双指针

前面已经写了两篇关于算法方面的文章&#xff0c;这几天想了下&#xff0c;决定把这个算法整理成一个系列&#xff0c;除了是帮助自己巩固算法知识外&#xff0c;还能够把自己总结的每种算法的套路保存下来并分享给大家&#xff0c;这样以后即使是哪天想要重拾起来&#xff0c;…

Apache Doris 详细教程(三)

7、监控和报警 Doris 可以使用 Prometheus 和 Grafana 进行监控和采集&#xff0c;官网下载最新版即可。 Prometheus 官网下载&#xff1a;https://prometheus.io/download/ Grafana 官网下载&#xff1a;https://grafana.com/grafana/download Doris 的监控数据通过 FE 和…

排序算法介绍(四)快速排序

0. 简介 快速排序&#xff08;Quick Sort&#xff09;是一种高效的排序算法&#xff0c;采用了分治的思想。它选择一个基准元素&#xff0c;通过一趟排序将待排序序列分割成独立的两部分&#xff0c;其中一部分的所有元素都比基准元素小&#xff0c;另一部分的所有元素都比基准…

C++-类和对象

目录 一.C语言和C的区别 二.类的引入 三.类的定义 1.类的定义 2.类的成员方法的两种定义方式&#xff1a; 3.类的成员变量的定义 四.类的访问限定符及封装 1.访问限定符 五.面向对象的三大特征 1.面向对象的三大特征分别是什么 2.封装 六.类的作用域 七.创建类对象 1.类…

【csdn默认使用操作详解】

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

国际语音通知系统有哪些优点?国际语音通知系统有哪些应用场景?

国际语音通知是一种全球性的通信工具&#xff0c;它通过语音方式向用户发送各种重要信息和提示。无论是快递到货的取件提醒、机场航班的延误通知&#xff0c;还是银行账户的余额提醒&#xff0c;国际语音通知都能准确、迅速地将信息传达给用户。 三、国际语音通知系统有哪些优…

qnx修改tcp和udp缓冲区默认大小

拷贝/home/test/qnx/qos223/target/qnx7/aarch64le/sbin/sysctl进系统中 https://www.qnx.com/developers/docs/7.1/#com.qnx.doc.neutrino.utilities/topic/s/sysctl.html kern.sbmax 默认262144&#xff0c;这个限制住了发送、接收缓冲器大小 ./sysctl -w kern.sbmax10000…

51单片机应用从零开始(十)·指针

指针 C语言指针是一种保存变量地址的数据类型。它可以让程序直接访问内存中的数据&#xff0c;而不需要通过变量名来访问。指针变量存储的是一个地址&#xff0c;这个地址指向内存中的某个位置&#xff0c;该位置存储了一个值。 在C语言中&#xff0c;可以使用&运算符取得一…

Siemens-NXUG二次开发-Java开发环境配置[20231203]

Siemens-NXUG二次开发-Java开发环境配置[20231203] 1.NX/UG Java API官方开发文档2.安装Java83.安装jetbrain idea3.windows系统环境变量配置4.使用idea创建项目5.NXOpen Java代码生效流程6.API体系简述6.代码示例 1.NX/UG Java API官方开发文档 西门子NX/UG Java api开发文档…