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

news2024/9/24 11:22:56

数据结构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.coloradmin.cn/o/2121841.html

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

相关文章

新手入门Python:魔法函数详解与应用

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 什么是魔法函数?📝 基础魔法函数📝 运算符重载📝 高级魔法函数📝 综合应用示例⚓️ 相关链接 ⚓️📖 介绍 📖 在Python编程的世界里,有一类特别的函数,它们看似普通,却拥有神奇的力量。这些函…

Word文档的读入【2】

现在&#xff0c;乔老师已经了解了Word文档的基本结构。 下面&#xff0c;我们通过观察一份答题卡来思考一下每条信息的具体位置。这样&#xff0c;在后面几天的学习和操作中&#xff0c;我们就能更快、更准确地读取到答题卡中的信息。 这份答题卡是由一个表格和一些段落组成。…

使用API有效率地管理Dynadot域名,查看某一订单当前的状态

前言 Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮箱&…

完美解决下载安装pytorch cuda版本超级慢的问题

问题描述 最近使用pytorch官网安装pytorch cuda版本的命令安装&#xff0c;使用的是官方的镜像源&#xff0c;速度非常慢&#xff0c;通常只有200KB/s&#xff1b;记得以前安装的时候速度可以达到10M/s&#xff0c;不知道最近是不是对国内限速了。 尝试更换成国内镜像源&…

Maven常用标签及作用

Maven常用标签及作用 Maven常用标签及作用parent标签 dependencies和dependencyManagement&#xff0c;以及两者的区别dependencies标签dependencyManagement标签packaging标签 Maven常用标签及作用 parent标签 依赖管理&#xff1a;父POM可以定义一组共享的依赖项(dependenc…

m3u8网页视频文件爬取与视频合成

文章目录 m3u8网页视频文件爬取与视频合成下载m3u8文件下载m3u8文件列表所对应的ts文件下载ffmpeg m3u8网页视频文件爬取与视频合成 我们经常在网络上找到的自己想要的视频素材却无法下载&#xff0c;并且打开控制台一看视频是通过分割成一份份的.ts文件发送过来的。 下载m3u8…

SDXL-Lightning容器构建指南

一、介绍 SDXL-Lightning 项目是由字节跳动开发的一个创新性的 AI 图像生成项目&#xff0c;该项目通过采用全新的蒸馏战略&#xff0c;优化了扩散模型&#xff0c;实现了从文字到高清图像的快速、高质量生成。 1. 项目背景与特点 背景 &#xff1a;随着 AI 绘画技术的不断发…

展会通过智慧客流统计分析优化运营策略-讯鹏科技

在当今数字化高速发展的时代&#xff0c;展会行业也在积极探索利用智慧科技进行转型与升级。其中&#xff0c;智慧客流统计分析成为了展会优化运营策略的关键要素。 智慧客流统计分析首先为展会提供了精准的数据支撑。通过先进的传感器、摄像头等设备&#xff0c;能够实时、准确…

以数据重塑服务管理体系,构建“无陪护病房” 数字化新生态 | 云生智慧护理运营系统

无陪护病房是一种新型的医院服务模式&#xff0c;旨在减轻患者家属的陪护负担&#xff0c;提供更加专业化和人性化的护理服务。 随着社会老龄化的加深和家庭结构的变化&#xff0c;2024年6月国家推出关于“无陪护病房”规范发展&#xff0c;无陪护病房服务有望在全国范围内得到…

SAP ABAP 删除请求

不小心把一个不想改的程序激活了&#xff0c;创建请求了怎么办 在se09里点击修改&#xff0c;然后删除即可

在线翻译工具盘点,这四大工具值得推荐!

翻译工具的存在方便了我们阅读跨语种的文件&#xff0c;跨文化交流变得前所未有的便捷。今天&#xff0c;就让我们一起来探索包括谷歌翻译的几款深受用户喜爱的翻译工具吧&#xff01; 福昕在线翻译 直达链接&#xff1a; https://fanyi.pdf365.cn/ 提到福昕在线翻译&#…

使用vue2+axios+chart.js画折线图 ,出现 RangeError: Maximum call stack size exceeded 错误

目录 效果图 解决方案 修正要点 效果图 修改前App.vue代码&#xff1a; <template><div id"app"><canvas id"myChart"></canvas></div> </template><script> import axios from axios; import { Chart, regis…

(rs系列)rs6之补环境

网址&#xff1a;aHR0cHM6Ly93d3cubm1wYS5nb3YuY24vZGF0YXNlYXJjaC9ob21lLWluZGV4Lmh0bWw rs6同样是两次html请求&#xff0c;第一次是412&#xff0c;cookie的差异性跟4、5同理&#xff0c;需要注意的是rs6无限debugger有三个&#xff0c;并且第三个需要注入hook代码才能过掉。…

从0开始搭建自动化测试平台,构建自动化测试平台的最全指南!

前言 随着软件开发的不断进步&#xff0c;测试工程师也需要跟上趋势并适应新的测试方法。自动化测试已成为现代测试领域中不可或缺的一部分。它可以提高测试效率、减少测试成本&#xff0c;并且可以避免人为错误对测试结果的影响。在这篇文章中&#xff0c;我们将介绍如何构建…

基于STC12C5A60S2单片机的LED汉字显示系统的设计

本设计基于单片机的LED汉字显示装置&#xff0c;该设计以STC12C5A60S2单片机为核心&#xff0c;利用最小系统和多个模块完成设计&#xff0c;包括点阵驱动模块、时钟模块、串口通信模块、红外线接收模块以及LED点阵屏。其中&#xff0c;点阵驱动模块采用74HC245芯片设计完成&am…

基于Python的电影推荐系统设计与实现---附源码80129

摘要 本项目旨在基于Python设计和实现一个电影推荐系统&#xff0c;旨在为用户提供个性化的电影推荐服务。通过分析用户的观影历史、评分和偏好等数据&#xff0c;系统将利用推荐算法为用户推荐符合其口味的电影。该系统将结合Python编程语言和数据分析技术&#xff0c;实现智能…

让AI给你写代码(10.2)具备调用本地库能力的AI小助手代码资源及简单介绍

接上一篇让AI给你写代码(10.1): 按接口编程的思想,统一利用内部和外部的接口,逐步扩展和提升AI编程能力 这篇我们将对照需要解决的问题,比较详细介绍一下AI小助手相关代码架构、实体,相关方法和工具。 对照10.1 新版AI小助手的需要做的流程如下: 与10.1流程图基本一致…

Docker部署nginx容器无法访问80端口

问题说明 在阿里云ECS服务器上部署一台CentOS服务器&#xff0c;然后在里面安装了docker服务。用docker部署了nginx&#xff0c;开启docker中的nginx服务&#xff0c;映射宿主机端口80 把阿里云服务器上面的安全组放开了80端口 但是还是无法访问nginx的80web界面 问题分析 查…

油猴脚本安装,3种安装方法

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽Loading&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495…

并发编程:AQS(上)

一、AQS 是什么&#xff1f; AQS 的全称为 AbstractQueuedSynchronizer &#xff0c;翻译过来的意思就是抽象队列同步器。这个类在 java.util.concurrent.locks 包下面。 AQS 就是一个抽象类&#xff0c;主要用来构建锁和同步器。 public abstract class AbstractQueuedSynch…