蓝桥之链表

news2024/11/27 18:49:49

最近真的特别焦虑,体测、比赛和考试一个接一个,让人喘不过气来QAQ

甚至考试和比赛还有冲突,sad

最近因为看了牙,打了药的缘故,一直在吃素QAQ

本来今天还想写个知识点总结的,但是太晚了,现在已经快凌晨1点了,而且黑灯瞎火的坐在床上小心翼翼(怕打扰到舍友睡觉)的敲代码真的很痛苦,以后有时间就补上!

明天早上七点半还得到小操场集合,学校在搞社团文化活动QAQ


1.自行车停放

题目描述

有 n 辆自行车依次来到停车棚,除了第一辆自行车外,每辆自行车都会恰好停放在已经在停车棚里的某辆自行车的左边或右边。(e.g.停车棚里已经有 3辆自行车,从左到右编号为:3,5,1。现在编号为2的第4辆自行车要停在5 号自行车的左边,所以现在停车棚里的自行车编号是:3,2,5,1)。给定n辆自行车的停放情况,按顺序输出最后停车棚里的自行车编号。n < 100000。

输入描述

第一行一个整数 n 。第二行一个整数 x 。表示第一辆自行车的编号。 以下n -1行,每行3个整数x,y,z。z = 0 时,表示编号为 x 的自行车恰停放在编号为 y 的自行车的左边。z = 1时,表示编号为 x 的自行车恰停放在编号为 y 的自行车的右边。

输出描述

从左到右输出停车棚里的自行车编号

输入输出样例

示例

输入

4

3
1 3 1
2 1 0
5 2 1

输出

3 2 5 1 


按照书中的教程,应该是用个链表来做,但是为了省事,我用的vector数组

先把第一个给定的元素放到vector数组中,然后循环来判断每组给定的数据,用find找到编号为y的自行车,如果z = 0,就把x 插入insert()到y的左边,否则,插入到y的右边。最后按格式输出。


C++ 

#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 100010;
vector<int> a(N);
int main()
{
  int n,x;
  cin>>n>>x;
  a[0] = x;
  for(int i = 1;i<n;i++){
      int y,z;
      cin>>x>>y>>z;
      auto it = find(a.begin(),a.end(),y);
      if(z == 0) a.insert(it,x);
      else a.insert(it + 1,x);   
  }
  cout<<a[0];
  for(int i = 1;i<n;i++)
    cout<<" "<<a[i];
  return 0;
}

2.小王子单链表

题目描述

小王子有一天迷上了排队的游戏,桌子上有标号为 1- 10 的 10 个玩具,现在小王子将他们排成一列,可小王子还是太小了,他不确定他到底想把那个玩具摆在哪里,直到最后才能排成一条直线,求玩具的编号。已知他排了M次,每次都是选取标号为 X 个放到最前面,求每次排完后玩具的编号序列。


要求一:采用单链表解决

输入描述

第一行是一个整数 M,表示小王子排玩具的次数。
随后 M 行每行包含一个整数 X,表示小王子要把编号为 X 的玩具放在最前面。

输出描述

共 M 行,第i行输出小王子第i次排完序后玩具的编号序列。

输入输出样例

示例 1

输入
 

5

3

2

3

4

2

输出

3 1 2 4 5 6 7 8 9 10

2 3 1 4 5 6 7 8 9 10

3 2 1 4 5 6 7 8 9 10

4 3 2 1 5 6 7 8 9 10

2 4 3 1 5 6 7 8 9 10 


按要求来哦~题目中说要采用单链表来完成

可以定义一个结构体,存放当前节点的data和指向下一个数据的指针。用数组来模拟~

对于单链表来说,如何找到它的前驱是个问题,所以你最好定义一个函数来查找前驱,通过for循环遍历链表中的每一个节点,并存储它的前驱,如果找到了x的前驱,就退出循环,返回x的前驱

最后在主函数中把x的指针指向改动一下,这个最好在纸上画画,思路会比较清晰,也不容易出错


C++ 

#include <iostream>
using namespace std;
const int N = 20;
struct Node{
    int data;
    int next;
}node[N];
int del(int x){
    int pre = 0;
    for(int it = node[0].next;it!=-1;){
        if(node[it].data == x) return pre;
        pre = it;
        it = node[it].next;
    }
    return pre;
}
int main(){
    int m;
    cin>>m;
    node[0].next = 1;
    for(int i = 1;i<=10;i++)//数据存放到单链表中
    {
        node[i].data = i;
        node[i].next = i + 1;
    }
    node[10].next = -1;
    while(m--){
        int x;
        cin>>x;
        int pre = del(x);
        node[pre].next = node[x].next;
        node[x].next = node[0].next;
        node[0].next = x;
        cout<<x;
        x = node[x].next;
        for(int i = 1;i<10;i++)
        {
            cout<<" "<<x;
            x = node[x].next;
        }
        cout<<endl;
    }
    return 0;
}

 3.小王子双链表

题目描述

小王子有一天迷上了排队的游戏,桌子上有标号为1-10 的 10 个玩具,现在小王子将他们排成一列,可小王子还是太小了,他不确定他到底想把那个玩具摆在哪里,直到最后才能排成一条直线,求玩具的编号。已知他排了M次,每次都是选取标号为 X 个放到最前面,求每次排完后玩具的编号序列。

要求一:采用循环链表解决

输入描述

第一行是一个整数 M,表示小王子排玩具的次数。随后 M 行每行包含一个整数 X,表示小王子要把编号为 X 的玩具放在最前面。

输出描述

共 M 行,第i行输出小王子第i次排完序后玩具的编号序列。

输入输出样例

示例1

输入

5

3

2

3

4

2

输出

3 1 2 4 5 6 7 8 9 10

2 3 1 4 5 6 7 8 9 10

3 2 1 4 5 6 7 8 9 10

4 3 2 1 5 6 7 8 9 10

2 4 3 1 5 6 7 8 9 10 


按要求来哦~题目中说要采用双链表来完成,双链表的话,对于找前驱就不是很费劲啦~

比较容易出错的点就是指针的移动,如果你要删除x,x的前一个节点的next指针和后一个节点的pre指针都要改动,在着,你把x移动到最前面,鉴于本链表是个循环链表,所以你插入的位置的前一个位置的next要变,插入位置的后一个位置的pre指针也要变才可以 ^^


C++ 

#include <iostream>
using namespace std;
const int N = 20;
struct Node{
    int pre;
    int next;
}a[N];
int main()
{
  int m;
  cin>>m;
  a[0].next = 1;
  for(int i = 1;i<=10;i++){
      a[i].next = i + 1;
      a[i].pre = i - 1;
  }
  a[10].next = 1;
  a[1].pre = 10;
  while(m--){
      int x;
      cin>>x;
      int prev = a[x].pre;//x的前驱
      int nex = a[x].next;//x的后继
      //删除
      a[prev].next = a[x].next;
      a[nex].pre = a[x].pre;
      //插入
      int first = a[0].next;
      int end = a[0].pre;
      a[x].next = first;
      a[x].pre = end;
      a[first].pre = x;
      a[end].next = x;
      a[0].next = x;
      cout<<x;
      for(int i = 1;i<10;i++)
      {
          cout<<" "<<a[x].next;
          x = a[x].next;
      }
      cout<<endl;
  }
  return 0;
}

4.约瑟夫环


题目描述


设有 n 个人围坐在圆桌周围,现从某个位置k上的人开始报数,报数到 m的人就站出来。下一个人,即原来的第 m +1个位置上的人,又从1开始报数,再报数到 m 的人站出来。依次重复下去,直到全部的人都站出来为止。试设计一个程序求出这 n 个人的出列顺序。 

要求一:采用循环链表解决。
要求二:可以使用模拟法,模拟循环链表。
要求三:可以不使用循环链表类的定义使用方式。


输入描述

输入只有一行且为用空格隔开的三个正整数 n,k,m,其含义如上所述。

输出描述

共 n 行,表示这 几 个人的出列顺序。

输入输出样例

示例 1

输入
 

3 5 8

输出

3

2


如果不是这道题,我写博客就不会这么晚

不过这道题也暴露了我指针学的不怎么踏实

这道题多亏有魏佬指点,才能够通过,在这里表示感谢,^^

最后又改进了一下

哈哈,一波三折的一道题

上面的题巩固了一下单链表,循环链表,所以这个题我用的STL的list做的,至于题目中说的三个要求,以后有时间再补上吧^^

先把这十个数字存到表里面,然后迭代器找到k所对应的位置,每次循环m次,找到要删除的位置,输出位置对应的值,最后用erase删除,循环结束的条件是表中再无数据


C++ 

#include<iostream>
#include<list>
using namespace std;
list<int> node;
int main(){
  int n,k,m;
  cin>>n>>k>>m;
  for(int i = 1;i<=n;i++)
    node.push_back(i);
  auto it = node.begin();
  for(int i = 1;i<k;i++)
    {
      ++it;
      if(it == node.end()) it = node.begin();
    }
  while(node.size()){
    for(int j = 1;j<m;j++){
      ++it;
      if(it == node.end()) it = node.begin();
    }
    cout<<*it<<endl;
    it = node.erase(it);
    if(it == node.end()) it = node.begin();
  }
  return 0;
}

我以为我电脑能撑到我写完,结果关机了hh

这里附一下一波三折的过程~做下记录


一开始我写的代码(怎么都对不了):

#include<iostream>
#include<list>
using namespace std;
list<int> node;
int main(){
  int n,k,m;
  cin>>n>>k>>m;
  for(int i = 1;i<=n;i++)
    node.push_back(i);
  auto it = node.begin();
  for(int i = 1;i<k;i++)
    {
      ++it;
      if(it == node.end()) it = node.begin();
    }
  while(node.size()){
    for(int j = 1;j<m;j++){
      ++it;
      if(it == node.end()) it = node.begin();
    }
    auto tt = it;
    cout<<*it<<endl;
    node.erase(it);
    it = ++tt;
    if(it == node.end()) it = node.begin();
  }
  return 0;
}

后来求助魏佬 ,大佬果然是大佬,一眼看出问题所在,这里附上截图~

后来我发现其实根本用不到tt,所以又改进了一下 ~才有了这最后的结果


ending~

今明两天准备计算机网络的期中考试QAQ 

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

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

相关文章

吃透前端文件上传与文件相关操作

最近在学文件上传的操作,所以想把学习到东西写成一文章 这片文章是我以小白视角 慢慢学习并熟悉前端文件相关操作的流程总结出来的 前端文件上传 我首先想到是 <input type"file">选择文件</input>如果我们想限制上传文件的格式,大小或进行裁剪分片上传…

2022——蓝桥杯十三届2022国赛大学B组真题

问题分析 看到这个问题的同学很容易想到用十层循环暴力计算&#xff0c;反正是道填空题&#xff0c;一直算总能算得出来的&#xff0c;还有些同学可能觉得十层循环太恐怖了&#xff0c;写成回溯更简洁一点。像下面这样 #include <bits/stdc.h> using namespace std; in…

树莓派4B-搭建一个本地车牌识别服务器

实现目标&#xff1a; 一、设备自启后能够获得服务的ip与端口号&#xff0c;用于计算机连接设备&#xff1b; 二、计算机可以通过服务ip与端口访问设备服务&#xff1b; 三、上传需要处理的数据&#xff0c;返回结果反馈给用户&#xff1b; 四、上传到服务器的数据不会导致设备…

Study--Oracle-02-单实例部署Oracle19C

一、CentOS 7 环境准备 1、软件准备 操作系统&#xff1a;CentOS 7 数据库版本: Oracle19C 2、操作系统环境配置 关闭selinux &#xff0c;编辑 /etc/selinux/config文件&#xff0c;设置SELINUX enforcing 为SELINUXdisabled [rootoracle ~]# grep SELINUX /etc/seli…

手游掘金最新玩法,单条视频变现1w+,一部手机即可操作,保姆级教程

如果你也想通过手机赚钱&#xff0c;在这里有一个非常好的项目&#xff0c;它可以让你轻松赚到额外的收入。 这个手游掘金最新玩法&#xff0c;是一个非常受欢迎的项目&#xff0c;它可以让你通过制作单条视频来获得高额收益。不同于传统的游戏赚钱方式&#xff0c;这个方法不…

HTML表单创建学习

文章目录 1、创建HTML框架2.body标签CSS3.表单创建3.1、添加fieldset与label标签3.2、为label标签添加css样式3.3、添加input标签3.4、添加提交按钮3.5、在input标签中添加required3.6、添加minlength属性3.7、pattern属性3.8、设置表单单选按钮无法同时选中3.9、添加链接3.10、…

SpringSecurity的核心原理使用总结

1. SpringSecurity的核心原理 对于最原始Servlet请求处理的层次结构 客户端->过滤器链->Servlet 对于在SpringMVC中处理请求的层次结构 如何让Filter与Spring建立连接呢? 因此它增加了一个DelegatingFilterProxy 它是SpringMVC提供的的Filter,它内部代理了一个原生的F…

HC-06 蓝牙串口从机 AT 命令详解

HC-06 蓝牙串口从机 AT 命令详解 要使用 AT 命令&#xff0c;首先要知道 HC-06 的波特率&#xff0c;然后要进入 AT 命令模式。 使用串口一定要知道三要素&#xff0c;一是波特率&#xff0c;二是串口号&#xff0c;三是数据格式, HC-06只支持一种数据格式: 数据位8 位&#…

测试平台开发:Django开发实战之注册界面实现(上)

实现注册功能&#xff0c;大概包括以下几个步骤 1、设计ui ##字段 通过看数据库里面的user表里面的字段&#xff0c;可以大概知道需要几个字段&#xff1a; emailusernamepasswordpassword_confirm 生成简单的ui界面&#xff0c;复制这个html代码 然后在项目路径下面创建一…

transformer与beter

transformer与beter 解码和编码器含义tokizer标记器和one-hot独热编码编码解码--语义较好的维度空间矩阵相乘--空间变换编码理解如何构造降维的嵌入矩阵--实现到达潜空间上面是基础&#xff0c;下面是transformer正文自注意力机制注意力分数--上下文修正系数为什么需要KQ两个矩…

KAN 笔记

1 Title KAN: Kolmogorov–Arnold Networks&#xff08;Ziming Liu, Yixuan Wang, Sachin Vaidya, Fabian Ruehle, James Halverson, Marin Soljačić, Thomas Y. Hou, Max Tegmark&#xff09;【2024】 2 Conclusion Inspired by the Kolmogorov-Arnold representat…

函数式接口-闭包与柯里化

闭包 定义 示例 注意 这个外部变量 x 必须是effective final 你可以生命他是final&#xff0c;你不声明也会默认他是final的&#xff0c;并且具有final的特性&#xff0c;不可变一旦x可变&#xff0c;他就不是final&#xff0c;就无法形成闭包&#xff0c;也无法与函数对象一…

《Python编程从入门到实践》day26

# 昨日知识点回顾 添加Play按钮创建Button类绘制按钮开始游戏、游戏结束重制游戏影藏鼠标光标 # 今日知识点学习 14.2 提高等级 14.2.1 修改速度设置 # Settings.py# 加快游戏节奏的速度self.speedup_scale 1.1self.initialize_dynamic_settings()def initialize_dynamic_se…

Linux中的fork与进程地址空间

目录 前言 一、进程地址空间 二、fork的值返回 三、高清图链接 总结 前言 在博主的《进程状态解析》一文中&#xff0c;在讨论进程创建时&#xff0c;提到了一个系统调用接口fork&#xff0c;它在使用过程中表现出对于父子进程不一致的返回结果&#xff0c;而且似乎还具有…

动手学机器学习15 实战kaggle比赛

动手学机器学习15 实战kaggle比赛 1. 实战kaggle比赛&#xff1a;预测房价代码结果 2. 课程竞赛&#xff1a;加州2020年房价预测3. QA4. 用到的代码1. hashlib.sha1()2. sha1.update(data)3. train_data.iloc4. fillna(0)5. pd.get_dummies(&#xff09;6. nn.MSELoss()7. torc…

医疗行业面临的网络安全挑战及应对策略

网络攻击已经成为各行各业日益严重的威胁&#xff0c;但医疗行业尤其容易受到影响。2023年&#xff0c;医疗领域的黑客事件占数据泄露的79.7%。 医疗领域 虽然患者、医疗服务提供者和决策者都对保护医疗信息有所关注&#xff0c;但关键的弱点在于提供电子健康记录&#xff08;…

何为小波变换?

一、数学基础 小波 变换脱胎于傅里叶变换&#xff0c;但是有着傅里叶变换的优点。 1.1 点乘&#xff08;内积&#xff09; a 6; b 8; 点乘的作用&#xff1a;衡量两个事物的相似度&#xff08;Similarity&#xff09; 夹角变小&#xff0c;点乘结果变大&#xff0c;结果越…

Vscode----远程服务器改名

问题描述 一开始Autodl服务器机子很多,但是我使用vscode的时候他们的名字都一样,导致每次要打开机子是都需要重新输入ssh和密码 解决方法 修改vscode端服务器的名字即可解决 打开远程设置,选择你的ssh配置文件 将Host改为你想要的名字,保存刷新即可 点击访问博客查看更多…

全国药品价格目录数据库-药品价格查询

药品定价是一个复杂且多维的问题&#xff0c;它涉及到医疗保健系统、政府政策、市场需求、研发成本以及药品效果等多个因素。随着中国医疗改革的不断深入&#xff0c;药品定价机制也在逐步调整和完善。本文将详细探讨我国药品定价机制&#xff0c;包括其发展历程、定价方法、影…

【顺序程序设计-谭浩强适配】(适合专升本、考研)

无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 完整资料如下&#xff1a;纯干货、纯干货、纯干货&#xff01;&#xff01;…