题目地址

原始想法

既然给定的序列是乱序的;
但是输出要求顺序,再按块反转输出
那么我为何不直接在读入的时候调整为顺序呢!

具体思路

  1. 读入1个结点后,剩下的结点,仅存在以下3种情况
    插在他前面;插在他后面;直接空置(放到另一个容器a里)
  2. 由于存在空置,因此当输入最后一个时,对容器a进行遍历,再次插入,直到符合题意的首尾
  3. 通过reverse进行块反转
  4. 输出时第一个是特殊的,中间是有一定规律的,最后补上-1

代码

#include<bits/stdc++.h>
using  namespace std;typedef struct node {string address, next;int key;
}node;
string start;
string tail{ "-1" };
int quantity = 0, group = 0;void Insert(int i, node* w, deque<node*>& o, vector<node*>& t);
int main() {cin >> start;scanf("%d %d", &quantity, &group);deque<node*> order;vector<node*> temp;for (int i = 0; i < quantity; i++) {node* w = new node;cin >> w->address >> w->key >> w->next;Insert(i, w, order, temp);}for (int i = group; i <= order.size(); i += group) {reverse(order.begin() + i - group, order.begin() + i);}for (auto i = order.begin(); i != order.end(); i++) {if (i == order.begin()) {//修正首cout << (*i)->address << " " << (*i)->key << " ";}else {cout << (*i)->address << "\n" << (*i)->address << " " << (*i)->key << " ";}}cout << "-1";return 0;
}
void Insert(int i, node* w, deque<node*>& o, vector<node*>& t) {if (!i) {o.push_back(w);return;}if (o.back()->next == w->address) {o.push_back(w);}else if (o.front()->address == w->next) {o.push_front(w);}else {t.push_back(w);}if (i == quantity - 1) {while (o.back()->next != tail || o.front()->address != start) {vector<node*>::iterator j = t.begin();for (; j != t.end(); j++) {if (o.back()->next == (*j)->address) {o.push_back(*j);}else if (o.front()->address == (*j)->next) {o.push_front(*j);}}}}
}

优缺点


柳神代码的地址:https://www.liuchuo.net/archives/1910

对比柳神最大边界
在空间上占用较大,时间相较柳神的会短10ms左右
猜测原因:

  1. 效率高纯粹是双端队列头尾插入非常迅速
  2. 开了2个vector,由于vector不能进行动态变化,因此占用了2倍空间
  3. 同时采取string,空间占据也会更大一些
  4. next同时包含在数据结构内,也是占用了空间的,可能用map空间效率会更高,但写起来可能相对繁琐

彩蛋——测试点推测

测试点4为最小边界
测试点5为最大边界
测试点6有废点

PAT 1074 Reversing Linked List——双端队列解法相关推荐

  1. PAT 1074 Reversing Linked List

    1074 Reversing Linked List (25point(s)) Given a constant K and a singly linked list L, you are suppo ...

  2. PAT 1074. Reversing Linked List (25)

    Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elem ...

  3. PAT甲级1074 Reversing Linked List :[C++题解]反转链表,借用vector

    文章目录 题目分析 题目链接 题目分析 分析:数组模拟链表,这题反转操作在数组中进行,然后直接输出即可,甚至不用放回到链表. //遍历链表,该链表用数组模拟 //保存链表结点地址到数组中 for(in ...

  4. C++ 双端队列(deque)的使用

    双端队列(deque)是什么 双端队列(deque)是一种随机访问的数据类型,提供了在序列两端快速插入和删除的功能,deque类似于vector, 双端队列(deque)属于STL(Standard ...

  5. python deque双端队列的神奇用法

    python中的deque双端队列,类似list的任意一端都可实现较快的add和pop操作 from collections import dequed=deque(maxlen=20) for i ...

  6. python数据结构与算法:队列与双端队列

    双端队列: #################队列#################### #coding:utf-8 """ Deque() 创建一个空的双端队列 ad ...

  7. LeetCode实战:设计循环双端队列

    题目英文 Design your implementation of the circular double-ended queue (deque). Your implementation shou ...

  8. 数据结构之队列、双端队列

    数据结构之队列.双端队列 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表. 队列是一种先进先出的(First in First Out)的线性表,简称FIFO.允许插入的 ...

  9. 关于学习Python的一点学习总结(54->集合->堆->双端队列)

    集合,堆,双端队列 再谈集合set:集合是由内置类set实现的 >>> set(range(10)){0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 可使用序列(或其他可 ...

最新文章

  1. c语言贪心算法合并箭,LeetCode刷题题库:贪心算法
  2. 你真的会学习吗?从结构化思维说起
  3. 跨界巨头谋定现代农业-农民丰收节交易会:全产业链布局
  4. 谈判如何在博弈中获得更多_读后感--《谈判--如何在博弈中获得更多》
  5. Mac下安装MariaDB(自用备忘)
  6. java中的排序方法,Java中的排序比较方式:自然排序和比较器排序
  7. iOS 加载本地html文件详细操作
  8. 【MySQL】MySQL基础理论学习笔记
  9. 基于无监督深度学习的单目视觉的深度和自身运动轨迹估计的深度神经模型
  10. Android GridView属性集合
  11. java中int和Integer对比的一些坑
  12. Ubuntu下好用的小工具
  13. Java是否存在内存泄露
  14. python 单向链表逆序_python实现单链表反转(经典笔试题)
  15. java实现将word转换pdf
  16. windows11系统 “任务管理器已被管理员禁用”怎么解决
  17. layui use 定义js外部引用函数
  18. Stata | 简单操作2(display)
  19. 布袋除尘器过滤风速多少_布袋除尘器过滤风速的选择!
  20. SpringBoot:认认真真梳理一遍自动装配原理

热门文章

  1. 收购福克斯致利润低于预期 荣耀加身的迪士尼如何英雄归来?
  2. Lattice CrossLinkNx LIFCL-40应用连载4-RISC-V处理器访问I2CFIFO
  3. 分布式云边协同智能推理方法
  4. win10 英文版安装步骤
  5. linux qt rsa加密解密,使用Qt实现一个简化版的RSA加密算法
  6. 校园表白墙、微信表白墙、校园墙 微信小程序 JAVA 开发记录与分享
  7. pb数据窗口控件OLE
  8. python中文字符串多余空格_[785]python去掉字符串中多余的空格
  9. oracle修改时间字段
  10. AI技术在智能海报设计中的应用