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

news2024/12/23 22:49:14

本份题目来自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.coloradmin.cn/o/2103468.html

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

相关文章

javascript网页设计案例,非常详细

这里我将为你提供一个详细的JavaScript网页设计案例。我们将创建一个简单的动态网页&#xff0c;包含一个可以显示当前时间的时钟和一个可以切换背景颜色的按钮。 1. HTML部分 首先&#xff0c;我们需要创建一个HTML文件来定义网页的基本结构。 <!DOCTYPE html> <h…

Python ppt

python生成ppt&#xff0c;数据源为html from lxml import html from pptx import Presentation from pptx.util import Inches from pptx.dml.color import RGBColor from pptx.enum.shapes import MSO_SHAPE# HTML代码 html_content """ <html><b…

【深度学习 transformer】使用pytorch 训练transformer 模型,hugginface 来啦

Hugging Face是一个致力于开源自然语言处理&#xff08;NLP&#xff09;和机器学习项目的社区。它由几个关键组件组成&#xff1a; Transformers&#xff1a;这是一个基于PyTorch的库&#xff0c;提供了各种预训练的NLP模型&#xff0c;如BERT、GPT、RoBERTa、DistilBERT等。它…

【陪诊系统-PC管理端】动态路由

先说说这里为什么要使用动态路由&#xff1f; 因为前面的菜单管理功能模块中&#xff0c;可以创建或修改不同权限&#xff0c;当前登录账号可以绑定不同的权限&#xff0c;不同权限能访问的功能页面不同&#xff0c;所以使用动态路由来控制。 而登录成功后&#xff0c;服务器…

Sentence-BERT实现文本匹配【对比损失函数】

引言 还是基于Sentence-BERT架构&#xff0c;或者说Bi-Encoder架构&#xff0c;但是本文使用的是参考2中提出的对比损失函数。 架构 如上图&#xff0c;计算两个句嵌入 u \pmb u u和 v \pmb v v​之间的距离(1-余弦相似度)&#xff0c;然后使用参考2中提出的对比损失函数作为…

docker 安装 rabbitmq

参考文档&#xff1a; https://hub.docker.com/_/rabbitmq/ https://www.rabbitmq.com/docs/download https://www.kuangstudy.com/zl/rabbitmq#1366643532940484610 执行下面的命令 docker run -d -it --name myrabbit -e RABBITMQ_DEFAULT_USERadmin -e RABBITMQ_DEFAULT_PA…

“解决 Docker 启动失败:排查和修复 overlay2 存储驱动与网络模块问题”。

目录 1.报错如下 2.报错详解 1. ” 表明 overlay2 存储驱动挂载失败&#xff0c;找不到相应设备。 2.表明在路径中找不到 fuse-overlayfs 可执行文件。 3.表明加载 bridge 和 br_netfilter 模块失败。 4.及后续一系列关于停止服务的信息&#xff0c;是由于前面的错误导致的…

硬件生产厂家运维系统思路

当前硬件生产厂家运维已经逐渐摆脱原有的现场调试&#xff0c;初步诊断和运维已经进化为远程运维&#xff1b;主要方式为厂家建立运维系统&#xff0c;使用人员只需要关注厂家公众号或者登录官网&#xff0c;即可完成原来必须到现场才能解决的问题&#xff1b; 原弊端&#xff…

探讨 | 大模型在传统NLP任务的使用姿势

写在前面 今天给大家带来一篇震宇兄&#xff08;知乎邱震宇&#xff09;探讨大模型技术在提升传统NLP类任务效果上的应用方式的文章&#xff0c;主要从文本分类任务出发。 知乎&#xff1a;https://zhuanlan.zhihu.com/p/704983302PS&#xff1a;长文警告&#xff01;建议收藏…

Burp Suite Professional 2024.8 发布下载,新增功能概览

Burp Suite Professional 2024.8 (macOS, Linux, Windows) - Web 应用安全、测试和扫描 Burp Suite Professional, Test, find, and exploit vulnerabilities. 请访问原文链接&#xff1a;https://sysin.org/blog/burp-suite-pro/&#xff0c;查看最新版。原创作品&#xff0…

退火吗?C#/WinForm演示退火算法

退火模型&#xff1a;模拟退火算法&#xff08;Simulated Annealing, SA&#xff09;是一种概率型全局优化算法&#xff0c;灵感来源于物理学中的退火过程。它通过模拟金属退火过程中的加热和缓慢冷却&#xff0c;来寻找问题的近似全局最优解。算法开始时&#xff0c;初始温度设…

70万个哺乳动物功能基因集!这个数据库值得重视

生信碱移 Rummagene数据库 Rummagene 从 PubMed Central (PMC) 出版物提取了超70万个基因集&#xff0c;用于各类基因功能关联注释。 组学技术的引入逐渐将生物和生物医学研究从研究单个基因和蛋白质转向研究基因集、基因簇、分子复合物和基因表达模块。许多生物医学和生物研究…

log4j 清除MDC上下文 MDC分类日志

在项目里需要分类收集处理日志信息&#xff0c;使用 log4j的MDC在线程中添加分类信息。不过最近却出现日志信息记录错误的情况&#xff0c;具体来说&#xff0c;就是会出现本来是属于下一个分类的一部分信息莫名的记录到上一个分类的日志文件中了。这很显然是MDC信息错误造成的…

【nnUNet】环境安装

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ&#xff1a;870202403 公众号&#xff1a;VTK忠粉 前言 本文分享医疗分割模型nnUNet的环境安装教程&#xff0c;希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴的点赞关注&#xff0c;小易会继续努力分享&#xff0…

数据中台 | 数据智能平台产品系列文章,企业开发和盘活数据资产的利器!(上篇)

引言 发展数字经济&#xff0c;实现数字中国是我国的国家战略&#xff0c;坚定且不可动摇&#xff0c;近期随着《数据二十条》、《“数据要素”三年行动计划》、《关于加强数据资产管理的指导意见》等重磅政策的发布&#xff0c;使数字化转型成为越来越多企业增强竞争、扩大营收…

LabVIEW程序员错误排查思路

当LabVIEW程序员在开发过程中遇到难以解决的错误且网上搜不到答案时&#xff0c;需要采取系统性的方法进行排查和解决。这包括回顾代码逻辑、深入理解LabVIEW的底层机制、参考专业文献和求助社区等方式。下面将从多角度详细解读专业程序员在面对这种困境时的应对策略&#xff0…

【系统分析师】-面向对象方法

目录 1、基本概念 2、UML 2.1、基本结构 2.1.1.构造块 2.1.1.1、事物 2.1.1.2、关系 2.1.1.3、图形 2.1.2.规则 2.1.3.公共机制 2.2、41视图 3、面向对象分析OOA 3.1、用例模型 3.2、分析模型 4、面向对象设计OOD 4.1、细分 4.2、设计原则 5、面向对象的程序设…

一字线模组厂家的选择与使用技巧

在当今自动化与智能制造的浪潮中&#xff0c;一字线模组作为精密定位与传输的核心部件&#xff0c;其性能与质量直接关系到整个生产线的效率与稳定性。因此&#xff0c;选择合适的一字线模组厂家并掌握其使用技巧&#xff0c;对于提升企业竞争力至关重要。接下来我们跟着鑫优威…

四、配置三层交换实验组网

一、实验拓扑 二、实验目的 通过配置交换机&#xff0c;令不同vlan间的主机能够互相通信 三、实验步骤 SW12 <Huawei>undo terminal monitor Info: Current terminal monitor is off. <Huawei>system-view Enter system view, return user view with CtrlZ. [H…

Spring 学习笔记

概述 Spring 是一个企业级 J2EE 应用开发一站式解决方案&#xff0c;其提供的功能贯穿了项目开发的表现层、业务层和持久化层&#xff0c;同时&#xff0c;Spring 可以和其他应用框架无缝整合 Spring 的特性包括以下几个方面&#xff1a; 轻量&#xff1a;Spring 是一个轻量…