浙大数据结构:02-线性结构3 Reversing Linked List

数据结构MOOC

PTA习题

这道题也是相当费事,不过比上一个题好一些,这里我使用了C++的STL库,使得代码量大幅减少。
题干机翻:

1、条件准备

这里我准备采用map来存地址和值,因为map的查找效率也是不错的
数组arr是存链表的地址,并且依次相连的。
可能这里没有看懂,等后面看map的实现时应该就明白了。
主函数使cin、cout更快
#include <iostream>
#include <string>
#include <map>
using namespace std;const int M = 100005;
string arr[M];  //存链表起始地址int main()
{std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);   //加速

2、map定义,存储输入数据

这里主要说明一下map:
map<string,pair<int,string>> 可以让我们后续通过输入一个地址就能获取该结点的所有信息。
输入数据每一行为: address  data   next,
address用string这个键来存,data用pair里的int存,next用pair里的string存
 map<string, pair<int, string>> m;string qi;//起始地址int n;    //总共数据个数int k;    //反转数cin >> qi >> n >> k;for (int i = 1; i <= n; i++){string a;cin >> a;cin >> m[a].first >> m[a].second;//Address Data Next为输入格式,Address与Next存为string类型,data用int来存}

3、初始化arr数组

这里我们arr数组存的是每一行输入数据的address,循环遍历用过查找本数据的next来使数据连接起来,这样arr数组存的就是首尾相连的数据的address。
string t = qi;  int len = 0;   //记录arr数组长度while (m.find(t) != m.end())  //直到next为-1停下{arr[len++] = t;     t = m[t].second;   //更新t} 

4、反转(重点)

此处反转我们考虑恰好能全反转和留有几个小数据不反转的情况。

但无论如何都要先进行反转判断。

 int flag = 0;  //标记,规范输出方式for (int i = 1; i * k <= len; i++){
//i代表当前进行第几轮反转,i*k比arr中链表长度短都可以进行for (int j = i * k - 1; j >= (i - 1) * k; j--){//j表示当前该输出的位置if (flag)cout << ' ' << arr[j] << endl;    //因为输出的是下一行的地址所以,第一行输出不进行cout << arr[j] << ' ' << m[arr[j]].first;  //输出地址和数据flag = 1;   //除第一行后面都多输出一个并换行}}
这里用两重循环,第一重是当前进行第几轮反转,如果轮数与每轮反转数相乘小于arr数组长度即可进入循环体。
第二重是循环该轮反转的位置,从该轮的最后一处倒着遍历,就是i*k-1,直到反转k个结束。
里面flag是不让第一行输出进行的,每一行输出结尾与下一行开头相连,所以j又移动一次才输出该行next。
但是这里有一个问题,如果len==k时恰好输出完,但最后一行next没输出,我们一会再处理这个问题。
下面考虑剩几个数据不够k时不反转输出。
if (len % k){//取模不为0则证明有数据不反转直接输出for (int i = len - len % k; i < len; i++){//找到起始位置,一个一个输出cout << ' ' << arr[i] << endl;cout << arr[i] << ' ' << m[arr[i]].first;}}
我们通过取模就能判断剩没剩下,用len-len%k找到不反转的起始位置,往后一直输出到结尾。
注意这里循环体内先输出了next和换行,因为刚才说了反转结束后最后一行没输出完,而恰好这组数据有有不反转的,那这里可以处理。
后面输出意思跟前面类似。就是在最后的时候单独处理一下。
最后再把最后一行输出完,是-1直接输出就行
        cout << ' ' << "-1" << endl;

5、总结

这里使用了stl库里map的一些用法,如果不太熟的话可以先去学一下stl

完整代码如下:

#include <iostream>
#include <string>
#include <map>
using namespace std;const int M = 100005;
string arr[M];int main()
{std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);map<string, pair<int, string>> m;string qi;int n;int k;cin >> qi >> n >> k;for (int i = 1; i <= n; i++){string a;cin >> a;cin >> m[a].first >> m[a].second;}string t = qi;int len = 0;while (m.find(t) != m.end()){arr[len++] = t;t = m[t].second;}int flag = 0;for (int i = 1; i * k <= len; i++){for (int j = i * k - 1; j >= (i - 1) * k; j--){if (flag)cout << ' ' << arr[j] << endl;cout << arr[j] << ' ' << m[arr[j]].first;flag = 1;}}if (len % k){for (int i = len - len % k; i < len; i++){cout << ' ' << arr[i] << endl;cout << arr[i] << ' ' << m[arr[i]].first;}}cout << ' ' << "-1" << endl;return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPU环境配置:1.CUDA、Anaconda、Pytorch

一、查看显卡适配CUDA型号 查看自己电脑的显卡版本&#xff1a; 在 Windows 设置中查看显卡型号&#xff1a;使用 Windows I 快捷键打开「设置」&#xff0c;依次点击「系统」-「屏幕」和「高级显示器设置」&#xff0c;在「显示器 1」旁边就可以看到显卡名称。 右键点菜单图标…

43. 1 ~ n 整数中 1 出现的次数【难】

comments: true difficulty: 中等 edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9843.%201%EF%BD%9En%E6%95%B4%E6%95%B0%E4%B8%AD1%E5%87%BA%E7%8E%B0%E7%9A%84%E6%AC%A1%E6%95%B0/README.md 面试题 43. 1 &#xff5e; n 整数中 1 …

前端 Vue3 项目开发—— ESLint prettier 配置代码风格

ESLint & prettier 介绍 如果你用的是 pnpm create vue 来创建项目&#xff0c;那么创建项目时就会让你选择是否添加 ESLint 和 prettier 我们在上一篇博客中详细介绍过 ESLint&#xff0c;可以说上一篇博客是这篇博客的先修知识&#xff0c;所以各位小伙伴们请先去看看我…

LiveQing视频点播流媒体RTMP推流服务功能-支持大疆等无人机RTMP推流支持OBS推流一步一步搭建RTMP视频流媒体服务示例

LiveQing支持大疆等无人机RTMP推流支持OBS推流一步一步搭建RTMP视频流媒体服务示例 1、流媒体服务搭建2、推流工具准备3、创建鉴权直播间4、获取推流地址5、配置OBS推流6、推流及播放7、获取播放地址7.1 页面查看视频源地址7.2 接口查询 8、相关问题8.1、大疆无人机推流花屏 9、…

【每日刷题】Day111

【每日刷题】Day111 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. LCR 047. 二叉树剪枝 - 力扣&#xff08;LeetCode&#xff09; 2. LCR 049. 求根节点到叶节点数字…

怎么在mathtype中打空格 MathType空格键不能用

MathType是一款数学公式编辑器&#xff0c;可以帮助用户创建复杂的数学公式和方程式。它提供了一个用户友好的界面&#xff0c;使得编辑和排版数学公式变得更加容易和高效。用户可以直接在其界面中输入公式&#xff0c;也可以将已有的公式从其他文档中复制粘贴过来进行编辑。在…

【STM32CubeMX】MPU6050移植DMP流程

原本是想要自己的模拟I2C库&#xff0c;来组合时选块&#xff0c;对接上DMP所需接口&#xff0c;可是一直卡在初始化&#xff0c;后面改成STM32F4的硬件I2C&#xff0c;也是很便捷的对接上接口了。此外在也参考了网上的移植资料与记录。本文也作为学习笔记&#xff0c;记录下过…

Java项目: 基于SpringBoot+mybatis+maven+mysql教师工作量管理系统(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismavenmysql教师工作量管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观…

软件测试 - 性能测试 (概念)(并发数、吞吐量、响应时间、TPS、QPS、基准测试、并发测试、负载测试、压力测试、稳定性测试)

一、性能测试 目标&#xff1a;能够对个人编写的项目进行接口的性能测试。 一般是功能测试完成之后&#xff0c;最后做性能测试。性能测试是一个很大的范围&#xff0c;在学习过程中很难直观感受到性能。 以购物软件为例&#xff1a; 1&#xff09;购物过程中⻚⾯突然⽆法打开…

JRebel and XRebel离线安装

近期&#xff0c;使用JRebel and XRebel&#xff0c;发现总是安装不上&#xff0c;可能是网络的原因吧。所以就使用离线方式进行安装。 JRebel 是一款用于 Java 开发的生产力工具。它的主要功能是加速开发周期&#xff0c;通过在不重启 JVM 的情况下即时加载代码变更。这样&…

在VB.net中,如何把20240906转化成日期格式

标题 vb.net中&#xff0c;如何把20240906转化成日期格式 正文 在 VB.NET 中&#xff0c;将一个数字字符串&#xff08;如 "20240906"&#xff09;转换为日期格式&#xff0c;你可以使用 DateTime.Parse 或 DateTime.TryParse 方法。这些方法可以将符合日期格式的字符…

Github 2024-09-07Rust开源项目日报Top10

根据Github Trendings的统计,今日(2024-09-07统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10CUE项目1Python项目1Go项目1Polars: Rust中的DataFrame接口和OLAP查询引擎 创建周期:1354 天开发语言:Rust, Python协议类型:MIT …

【STM32开发】GPIO最全解析及应用实例

目录 【1】GPIO概述 GPIO的基本概念 GPIO的应用 【2】GPIO功能描述 1.IO功能框图 2.知识补充 3.功能详述 浮空输入 上拉输入 下拉输入 模拟输入 推挽输出 开漏输出 复用开漏输出和复用推挽输出 【3】GPIO常用寄存器 相关寄存器介绍 4个32位配置寄存器 2个32位数据寄存器 1个32位…

机器学习如何用于音频分析?

机器学习如何用于音频分析&#xff1f; 一、说明 近十年来&#xff0c;机器学习越来越受欢迎。事实上&#xff0c;它被用于医疗保健、农业和制造业等众多行业。随着技术和计算能力的进步&#xff0c;机器学习有很多潜在的应用正在被创造出来。由于数据以多种格式大量可用&…

JVM系列(十) -垃圾收集器介绍

一、摘要 在之前的几篇文章中,我们介绍了 JVM 内部布局、对象的创建过程、运行期的相关优化手段以及垃圾对象的回收算法等相关知识。 今天通过这篇文章,结合之前的知识,我们一起来了解一下 JVM 中的垃圾收集器。 二、垃圾收集器 如果说收集算法是内存回收的方法论,那么…

OrangePi AIpro 香橙派 昇腾 Ascend C 算子开发 与 调用 - 通过aclnn调用的方式调用AddCustom算子

OrangePi AIpro 香橙派 昇腾 Ascend C 算子开发 与 调用 通过aclnn调用的方式调用 - AddCustom算子 - 单算子API执行(aclnn) 多种算子调用方式 *开发时间使用场景调用方式运行硬件基于Kernel直调工程&#xff08;快速&#xff09;少单算子调用&#xff0c;快速验证算法逻辑IC…

Kafka【十二】消费者拉取主题分区的分配策略

【1】消费者组、leader和follower 消费者想要拉取主题分区的数据&#xff0c;首先必须要加入到一个组中。 但是一个组中有多个消费者的话&#xff0c;那么每一个消费者该如何消费呢&#xff0c;是不是像图中一样的消费策略呢&#xff1f;如果是的话&#xff0c;那假设消费者组…

C语言-程序环境 #预处理 #编译 #汇编 #链接 #执行环境

文章目录 前言 一、程序的环境翻译和执行环境 二、翻译环境 (一)、整体把握 (一)、编译 1、预处理(预编译) 2、编译 a、词法分析 b、语法分析 c、语义分析 d、符号汇总 3、汇编 (二)、链接 三、运行环境 总结​​​​​​​ 前言 路漫漫其修远兮&#xff0c;吾将…

9月7日微语报,星期六,农历八月初五

&#xff19;月&#xff17;日微语报&#xff0c;星期六&#xff0c;农历八月初五&#xff0c;周末愉快&#xff01; 一份微语报&#xff0c;众览天下事&#xff01; 1、21个部门&#xff1a;符合条件的流动儿童家庭或可配公租房。 2、多所高校2025年招生简章显示&#xff0…

API安全 | 发现API的5个小tips

在安全测试目标时&#xff0c;最有趣的测试部分是它的 API。API 是动态的&#xff0c;它们比应用程序的其他部分更新得更频繁&#xff0c;并且负责许多后端繁重的工作。在现代应用程序中&#xff0c;我们通常会看到 REST API&#xff0c;但也会看到其他形式&#xff0c;例如 Gr…