数据结构代码集训day15(适合考研、自学、期末和专升本)

news/2024/9/17 8:10:20/ 标签: 数据结构, 考研, 算法, 链表, c++

本份题目来自B站up:白话拆解数据结构


今日题目如下;

1)编写算法,实现十进制转十六进制;

(2)汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?

(3)假设你正在玩跳格子(所有格子排成一个纵列)游戏。需要跳完n 个格子你才能抵达终点。每次你可以跳 1 或 2 个格子。你有多少种不同的方法可以到达终点呢?


题1

        进制转换有个公式N = (N / d) + N mod d,就是下面这个过程(举个例子)

        上面那个里子是十进制转八进制,16进制也一样的过程,将被除数不断和16整除,余数(取模得到)压入栈中,再依次出栈即可。

        有一点不一样的就是,16进制到十之后含有字母ABCD等,所以超过10的数要单独处理一下。

int func(int m,int n){        // m为传入的数,n为要转换的进制

    bool flag=false;        

    if(m<0) {        // 负数单独处理

        m=abs(m);

        flag=true;

    }

    stack<int> s;

    int temp1,temp2;

    while(m>0){

        temp1=m%n;        // 余数压栈

        s.push(temp1);

        m=m/n;

    }

    if (flag) printf("-");

    while(!s.empty()){        // 依次出栈

        temp2=s.top();

        if(temp2<10)    printf("%d",temp2);

        else printf("%c",temp2-10+'A');        // 单独处理

        s.pop();

    }

    return 0;

}

 

实践一下:

将44转为16进制

 

将-38转为16进制

完整代码如下:

#include <iostream>
#include <cstdio>
#include <stack>
#include <cstring>
using namespace std;// 十进制转十六进制int func(int m,int n){bool flag=false;if(m<0) {m=abs(m);flag=true;}stack<int> s;int temp1,temp2;while(m>0){temp1=m%n;s.push(temp1);m=m/n;}if (flag) printf("-");while(!s.empty()){temp2=s.top();if(temp2<10)    printf("%d",temp2);else printf("%c",temp2-10+'A');s.pop();}return 0;
}int main(){int m,n;cin>>m>>n;func(m,n);return 0;
}

题2

         图示一下过程,我第一次读也没咋读懂。

        这是一道标准的递归题目,我们逐步拆解,假设只有一个盘子(也就是递归出口),直接放到c盘就行了。

        当有两个盘子的时候,先将一号盘放到b盘里,然后把2号盘放到c盘里,最后把1号盘放到c里就行了。

        关键来了,当有三个盘的时候,我们可以把上面两个视为一个整体,然后就是上面那种情况的变式了。

        就是将上面整体移动到B柱,然后将A柱最底下的盘子移到C柱,最后将B柱上的整体移动到C柱。看似好像因为不符合题意不可能完成,实际上 ① 和 ③将两个盘子移动另一个柱子上。而这恰恰是当n=2时,移动2个盘子的情况。

        当n=4时,有4个盘子时。同样的道理,将A柱上的3个盘子当做整体,然后依次完成以上三个步骤,就可实现目标。

        同理,类比到n,当有n个盘子时,可将A柱上的n-1个盘子作为一个整体,然后分别执行以上三个步骤,就可实现目标。

        建议大家画一下n=3或者n=4的情况,可以加深理解。当n不等于1时,其实是有两个递归过程的。下面是c++的类,也可以称为一种方法,里面有两个公共的成员函数,可以通过调用hanota函数来实现功能。

class Solution{

public:

    void hanota(stack<int> &a,stack<int> &b,stack<int> &c){

        int n=a.size();

        move(n,a,b,c);        //将a通过b移到c

    }

    void move(int n,stack<int> &a,stack<int> &b,stack<int> &c){

        if(n==1){

            int m=a.top();

            a.pop();

            c.push(m);

            return;

        }

        move(n-1,a,c,b);        //将a通过c移到b

        int s=a.top();

        a.pop();

        c.push(s);

        move(n-1,b,a,c);        //将b通过a移到c

    }

};

实践一下:

        这里我们是通过三个栈来实现的,我们先将栈a赋值,然后在调用hanota函数后,观察一下栈内元素大小变化,来判断是否转移了。

 

完整代码如下:

#include <iostream>
#include <cstdio>
#include <stack>
#include <cstring>
using namespace std;// 汉诺塔
class Solution{
public:void hanota(stack<int> &a,stack<int> &b,stack<int> &c){int n=a.size();move(n,a,b,c);}void move(int n,stack<int> &a,stack<int> &b,stack<int> &c){if(n==1){int m=a.top();a.pop();c.push(m);return;}move(n-1,a,c,b);int s=a.top();a.pop();c.push(s);move(n-1,b,a,c);}
};int main(){stack<int> a,b,c;for (int i = 6; i >= 1; --i) {int b;cin>>b;a.push(b);}printf("stack a value are:");for(int i=6;i>=1;--i){int s=a.top();printf("%d ",s);a.pop();}for (int i = 6; i >= 1; --i) {int b;cin>>b;a.push(b);}Solution cc;cc.hanota(a,b,c);printf("stack a length:%d\n",a.size());printf("stack b length:%d\n",b.size());printf("stack c length:%d\n",c.size());printf("stack c value are:");for(int i=6;i>=1;--i){int a=c.top();printf("%d ",a);c.pop();}return 0;
}

题3

        这题我第一遍读以为是DP,不过他问的是方案没让我打印具体路线,那递归也能做。等后面学完dp再来会会这道题。

        两个递归出口就行了。

int countWays(int n) {

    // 基本情况

    if (n == 0) return 1;  // 跳到第0格只有1种方法,即什么都不做

    if (n == 1) return 1;  // 跳到第1格只有1种方法

    // 递归计算

    return countWays(n - 1) + countWays(n - 2);

}

实践一下:n=4时有5种方案。

 

完整代码如下:

#include <iostream>
using namespace std;int countWays(int n) {// 基本情况if (n == 0) return 1;  // 跳到第0格只有1种方法,即什么都不做if (n == 1) return 1;  // 跳到第1格只有1种方法// 递归计算return countWays(n - 1) + countWays(n - 2);
}int main() {int n;cout << "Enter the number of steps (n): ";cin >> n;int ways = countWays(n);cout << "Number of ways to reach step " << n << ": " << ways << endl;return 0;
}

http://www.ppmy.cn/news/1522793.html

相关文章

TCP协议多进程多线程并发服务器

TCP多进程多线程并发服务器 1.多进程并发服务器 #include <myhead.h>#define SERPORT 6666 #define SERIP "192.168.0.136" #define BLACKLOG 10void hande(int a) {if(aSIGCHLD){while(waitpid(-1,NULL,WNOHANG)!-1);//回收僵尸进程} }int main(int argc, c…

深度学习(一)-感知机+神经网络+激活函数

深度学习概述 深度学习的特点 优点 性能更好 不需要特征工程 在大数据样本下有更好的性能 能解决某些传统机器学习无法解决的问题 缺点 小数据样本下性能不如机器学习 模型复杂 可解释性弱 深度学习与传统机器学习相同点 深度学习、机器学习是同一问题不同的解决方法 …

Gin自定义校验函数

在Web开发中&#xff0c;数据验证是确保用户输入符合预期格式的关键步骤。Gin框架通过集成go-playground/validator包&#xff0c;提供了强大的数据验证功能。除了内置的验证规则&#xff0c;Gin还支持自定义验证函数&#xff0c;这使得我们可以针对特定的业务需求灵活地定义验…

GitHub每日最火火火项目(9.8)

项目名称&#xff1a;polarsource / polar 项目介绍&#xff1a;polar 是一个开源的项目&#xff0c;它是 Lemon Squeezy 的替代方案&#xff0c;并且具有更优惠的价格。这个项目的目标是让开发者能够在自己热爱的编码工作中获得报酬。它为开发者提供了一种新的选择&#xff0c…

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式&#xff08;Singleton Pattern&#xff09; 确保一个类只有一个实例&#xff0c;并提供一个全局访问点。 示例代码&#xff1a; class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance this;this.data []…

数据结构基础详解(C语言): 树与二叉树的应用_哈夫曼树与哈夫曼曼编码_并查集_二叉排序树_平衡二叉树

文章目录 树与二叉树的应用1.哈夫曼树与哈夫曼曼编码1.1 带权路径长度1.2 哈夫曼树1.2.1 哈夫曼树的构造1.3 哈夫曼编码 2.并查集2.1 并查集的三要素2.1.1 并查集的逻辑结构2.1.2 并查集的存储结构 2.2 并查集的优化2.2.1 初步优化&#xff08;并操作优化&#xff09;2.2.2 终极…

mybatis官方仓库-常用的仓库都有哪些作用

在GitHub上&#xff0c;MyBatis组织下的37个仓库主要涵盖了MyBatis框架的各个方面&#xff0c;包括但不限于核心框架、插件、工具、示例以及与其他技术的集成等。以下是对这些仓库功能的大致分类和描述&#xff1a; MyBatis 核心项目 mybatis-3&#xff1a;这是MyBatis的核心…

C语言深度剖析--不定期更新的第五弹

const关键字 来看一段代码&#xff1a; #include <stdio.h> int main() {int a 10;a 20;printf("%d\n", a);return 0; }运行结果如下&#xff1a; 接下来我们在上面的代码做小小的修改&#xff1a; #include <stdio.h> int main() {const int a 1…

2024数学建模国赛ABCDE题选题分析及初步思路

高教社杯全国大学生数学建模竞赛&#xff08;以下简称“国赛”&#xff09;是面向全国大学生的一项重要赛事&#xff0c;旨在培养学生的数学建模能力、团队合作能力和科学研究能力。近年来&#xff0c;国赛的参赛人数和比赛难度不断提升&#xff0c;对参赛者的数学建模能力提出…

C++复习day05

类和对象 1. 面向对象和面向过程的区别是什么&#xff1f;&#xff08;开放性问题&#xff09; 1. **抽象级别**&#xff1a;- **面向对象**&#xff1a;以对象&#xff08;数据和方法的集合&#xff09;为中心&#xff0c;强调的是数据和行为的封装。- **面向过程**&#xf…

探索fastFM:Python中的高效推荐系统库

文章目录 &#x1f680; 探索fastFM&#xff1a;Python中的高效推荐系统库背景&#xff1a;为何选择fastFM&#xff1f;快照&#xff1a;fastFM是什么&#xff1f;安装指南&#xff1a;如何将fastFM加入你的项目&#xff1f;快速入门&#xff1a;五个基础函数的使用实战演练&am…

C语言第二周课

目录 引言: 一、数据类型大小及分类 (1)计算机中常用存储单位 (2)整体介绍一下C语言的数据类型分类。 (3)下面是我们本节课要学的基本内容----常用的数据类型 二、 数据类型的数值范围 三、打印输出类型 数据类型打印示例: 引言: 我们常常在写C语言程序时&#xff0c;总…

滚雪球学MyBatis-Plus(13):测试与部署

前言 在上期内容中&#xff0c;我们深入探讨了 MyBatis Plus 的高级功能&#xff0c;包括自定义 SQL 注解、批量操作以及数据加密与解密。这些功能极大地提高了开发效率&#xff0c;并增强了数据操作的灵活性和安全性。 本期内容将重点介绍 MyBatis Plus 的测试与部署。我们将…

win2003_prepatched_v6b有效期到2021年4月2日,所以编译win2k3会有错误

openssl 查看证书pfx过期时间win2003_prepatched_v6b有效期到2021年4月2日&#xff0c;所以编译win2k3会有错误 要使用OpenSSL查看PFX&#xff08;也称为PKCS#12&#xff09;证书的过期时间&#xff0c;你可以使用以下命令&#xff1a; openssl pkcs12 -in your_certificate.p…

设计模式 19 观察者模式

设计模式 19 创建型模式&#xff08;5&#xff09;&#xff1a;工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式结构型模式&#xff08;7&#xff09;&#xff1a;适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式、代理模式行为型模式&#xff…

自动化抢票 12306

自动化抢票 12306 1. 明确需求 明确采集的网站以及数据内容 网址: https://kyfw.12306.cn/otn/leftTicket/init数据: 车次相关信息 2. 抓包分析 通过浏览器开发者工具分析对应的数据位置 打开开发者工具 F12 或鼠标右键点击检查 刷新网页 点击下一页/下滑网页页面/点击搜…

stm32之外部flash下载算法

文章目录 下载算法下载到芯片的核心思想算法程序中擦除操作执行流程擦除操作大致流程&#xff1a;算法程序中编程操作执行流程算法程序中校验操作执行流程 创建MDK下载算法通用流程第1步&#xff0c;使用MDK提供好的程序模板第2步&#xff0c;修改工程名第3步&#xff0c;修改使…

LiveKit的agent介绍

概念 LiveKit核心概念&#xff1a; Room&#xff08;房间&#xff09;Participant&#xff08;参会人&#xff09;Track&#xff08;信息流追踪&#xff09; Agent 架构图 ​ 订阅信息流 ​ agent交互流程 客户端操作 加入房间 房间创建方式 手动 赋予用户创建房间的…

STM32(十二):DMA直接存储器存取

DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输&#xff0c;无须CPU干预&#xff0c;节省了CPU的资源。&#xff08;运行内存SRAM、程序存储器Flash、寄存器&#xff09; 12个独立可配置的通道&…

SAP自动化操作

业务场景 1、主数据维护&#xff08;物料、成本中心、科目、资产、供应商、客户等等&#xff09; 2、业务单据创建&#xff08;包括内部订单、销售订单&#xff0c;采购订单&#xff0c;生产订单&#xff0c;交货单等等&#xff09; 3、业务单据处理&#xff08;订单评审&…