1032 Sharing (25 分)

题意 :

  • suffix后缀;prefix前缀
  • 每个结点存一个字母,一共存两个单词
  • 分别给两个单词的第一个字母的地址以及总共的结点数
  • 给出所有结点的地址数值和下一个结点的地址(null就是-1)
  • 要求这两个单词最长公共后缀的起始位置的结点的地址,没有就输出-1

思路 :

  • 讲了一堆,模拟样例一发现就是找到两个链表中第一个拥有相同地址的结点,并输出这个地址,如果没有这个结点,就输出-1
  • 只要把第一个链表中每个地址都标记,遍历第二个链表的时候如果当前这个结点的地址被标记过,就return
  • 结点值和结点的下一个结点的地址,可以分别用两个数组存储,因为这里的地址最多是5位数,可以充当数组下标;e数组表示地址对应的结点值;ne数组表示地址对应下一个结点的地址
  • 链表的表头地址很重要

语法 :

  • 5位地址,输出记得格式化
#include <iostream>
using namespace std;const int N = 1e5 + 10;int n;
int h1, h2, ne[N];
char e[N];
bool st[N];int main()
{scanf("%d%d%d", &h1, &h2, &n);int address, next;char data;for (int i = 0; i < n; i ++ ){scanf("%d %c %d", &address, &data, &next);e[address] = data, ne[address] = next;}for (int i = h1; ~i; i = ne[i])st[i] = true;for (int i = h2; ~i; i = ne[i])if (st[i]){printf("%05d\n", i);return 0;}puts("-1");
}

1052 Linked List Sorting (25 分)

题意 :

  • 给一个链表,要求按照值排序后,输出链表

思路 :

  • 本题可能包含不在链表中的结点,这些结点无需统计(从它问你结点数推测),因此另外开一个vector重新建立链表
  • 链表可能为空
  • 且有可能同一个结点输入多次,所以用map存地址对应的结点更好
  • 以上这些题目都没有告诉你。。
  • 我们这里的地址用string而不用int,好处是就不需要格式化%05d了,它这样用到的地址全部是输入给你的地址,不会由于int和string的转换失去前导零

语法 :

  • for中可以string做循环变量,通过map重建vector版本链表
#include <iostream>
#include <unordered_map>
#include <vector>
#include <algorithm>
using namespace std;struct Node
{string address;int key;string next;bool operator< (const Node& t) const{return key < t.key;}
};int main()
{int n;char head[10];scanf("%d %s", &n, head);unordered_map<string, Node> map;char address[10], next[10];int key;while (n -- ){scanf("%s %d %s", address, &key, next);map[address] = {address, key, next};}vector<Node> nodes;for (string i = head; i != "-1"; i = map[i].next) nodes.push_back(map[i]);printf("%d ", (int)nodes.size());if (nodes.empty()) puts("-1");else{sort(nodes.begin(), nodes.end());printf("%s\n", nodes[0].address.c_str());for (int i = 0; i < nodes.size(); i ++ ){if (i + 1 == nodes.size())printf("%s %d -1", nodes[i].address.c_str(), nodes[i].key);elseprintf("%s %d %s\n", nodes[i].address.c_str(), nodes[i].key, nodes[i + 1].address.c_str());}}
}

1074 Reversing Linked List (25 分)

题意 :

  • 给一个链表和一个k,要求每k个结点为一组逆序,输出逆序后的链表

思路 :

  • 按逻辑顺序将链表的地址放入vector中
  • 注意输出链表的时候不是输出ne,而是输出q[i + 1]
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;const int N = 1e5 + 10;int n, head, m;
int e[N], ne[N];int main()
{scanf("%d%d%d", &head, &n, &m);int address, data, next;for (int i = 0; i < n; i ++ ){scanf("%d%d%d", &address, &data, &next);e[address] = data, ne[address] = next;}vector<int> q;for (int i = head; ~i; i = ne[i]) q.push_back(i);for (int i = 0; i + m - 1 < q.size(); i += m ){reverse(q.begin() + i, q.begin() + i + m);}for (int i = 0; i < q.size(); i ++ ){printf("%05d %d ", q[i], e[q[i]]);if (i != q.size() - 1) printf("%05d\n", q[i + 1]);else printf("-1\n");}
}

1097 Deduplication on a Linked List (25 分)

题意 :

  • data deduplication 重复元素删除
#include <iostream>
#include <cstring>
#include <vector>using namespace std;const int N = 100010;int n;
int h, e[N], ne[N];
bool st[N];int main()
{scanf("%d%d", &h, &n);for (int i = 0; i < n; i ++ ){int address, key, next;scanf("%d%d%d", &address, &key, &next);e[address] = key, ne[address] = next;}vector<int> a, b;for (int i = h; i != -1; i = ne[i]){int v = abs(e[i]);if (st[v]) b.push_back(i);else{st[v] = true;a.push_back(i);}}for (int i = 0; i < a.size(); i ++ ){printf("%05d %d ", a[i], e[a[i]]);if (i + 1 == a.size()) puts("-1");else printf("%05d\n", a[i + 1]);}for (int i = 0; i < b.size(); i ++ ){printf("%05d %d ", b[i], e[b[i]]);if (i + 1 == b.size()) puts("-1");else printf("%05d\n", b[i + 1]);}return 0;
}

1133 Splitting A Linked List (25 分)

题意 :

  • Splitting A Linked List 链表元素分类
  • 给定一个单链表,请编写程序将链表元素进行分类排列,使得所有负值元素都排在非负值元素的前面,而 [0,K] 区间内的元素都排在大于 K 的元素前面。
  • 但每一类内部元素的顺序是不能改变的。

语法 :

  • a.insert(a.end(), b.begin(), b.end());,在vector a容器的末尾加入vector b容器
#include <iostream>
#include <cstring>
#include <vector>using namespace std;const int N = 100010;int n, k;
int h, e[N], ne[N];int main()
{scanf("%d%d%d", &h, &n, &k);for (int i = 0; i < n; i ++ ){int address, key, next;scanf("%d%d%d", &address, &key, &next);e[address] = key, ne[address] = next;}vector<int> a, b, c;for (int i = h; i != -1; i = ne[i]){int v = e[i];if (v < 0) a.push_back(i);else if (v <= k) b.push_back(i);else c.push_back(i);}a.insert(a.end(), b.begin(), b.end());a.insert(a.end(), c.begin(), c.end());for (int i = 0; i < a.size(); i ++ ){printf("%05d %d ", a[i], e[a[i]]);if (i + 1 == a.size()) puts("-1");else printf("%05d\n", a[i + 1]);}return 0;
}

PAT甲级题目翻译+答案 AcWing(链表)相关推荐

  1. PAT甲级题目翻译+答案 AcWing(数学)

    1059 Prime Factors (25 分) 题意 : 给一正整数,要求分解质因数 思路 : 使用is_first,来完成除了第一个质因数前都有*的效果 如果n=1,要特判 最后如果n>1 ...

  2. PAT甲级题目翻译+答案 AcWing(排序)

    1012 The Best Rank (25 分) 题意 :给ID和3门成绩,计算其平均分A,输出每位学生最好的排名,A>C>M>E 思路 :如果将所需的若干个元素中使第一个元素为后 ...

  3. PAT甲级题目翻译+答案 AcWing(模拟)

    1008 Elevator (20 分) 思路 :last可能等于cur,而无论是否相等,res都是+5的 #include <iostream>using namespace std;i ...

  4. PAT甲级题目翻译+答案 AcWing(动态规划)

    1007 Maximum Subsequence Sum (25 分) 题意 :注意最后输出的不是索引而是在那个索引的数 思路 :f为当前的假设开始指针,每一次累加到sum,如果sum大于res,就更 ...

  5. PAT甲级题目翻译+答案 AcWing(图论)

    1003 Emergency (25 分) 题意 :求无向图中最短路的数量,以及在最短路情况下,点权之和最大是多少 思路 :dijkstra的扩展一般在第三步"用t更新其它点":s ...

  6. PAT甲级题目翻译+答案 AcWing(进位制)

    1010 Radix (25 分) 题意 :radix进制 题意 :给两个数和其中一个数的进制,问另一个数能否在某一进制下与这数相等 思路 :如果tag等于2就交换,最后还是只需要处理tag为1这种情 ...

  7. PAT甲级题目翻译+答案 AcWing(字符串处理)

    1001 A+B Format (20 分) 题意 :将整数转换成标准格式 思路 :从后往前遍历字符串进行模拟,每三个数字加一个逗号,但不能是在最前面加逗号,也不能是加在负号后面 #include & ...

  8. PAT甲级题目翻译+答案 AcWing(树)

    1004 Counting Leaves (30 分) 题意 : 家庭关系可以用家谱树来表示,给定一个家谱树,你的任务是找出其中没有孩子的成员. 第一行包含一个整数 N 表示树中结点总数以及一个整数 ...

  9. PAT甲级题目翻译+答案 AcWing(基础算法与数据结构)

    1029 Median (25 分) 题意 : median中位数 给两个升序的序列,要求它们两个合并后的中位数 思路 : 双指针 语法 : long int #include <iostrea ...

最新文章

  1. linux grep命令总结
  2. envi中的sg滤波_ENVI滤波
  3. Navicat远程服务器2013-Lost connection to MYSQL server at 'reading for initial communication packet' 公钥
  4. python错误代码提示手册_腾讯大佬整理了 Python 所有内置异常,Python高手必备的排错手册...
  5. Lesson4 一阶方程代换法
  6. 【Latex】数学公式排版
  7. c#调用python的四种方法
  8. 1055: 兔子繁殖问题 这是一个有趣的古典数学问题,著名意大利数学家Fibonacci曾提出一个问题:有一对小兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。
  9. Linux下shell显示用户名和主机名
  10. 人大金仓国产化数据库适配
  11. 腾讯2019技术岗笔试 猜硬币 众所周知,每一枚硬币都有两面,假定投掷一枚硬币,得到正面和反面的概率是一样的。小Q有一天和好朋友在玩投掷硬币的游戏,他投了n枚硬币,已知至少有p正,q反,求n枚硬币
  12. 2019智能手表推荐_智能手表什么牌子好,智能手表排行榜2020
  13. [图文]解读《碟中谍4》中的人脸识别技术
  14. nginx使用ngx.req.get_body_data()获取不到请求体内容
  15. 计算机的隐藏小秘密,手机里隐藏的小秘密,不看真的会后悔!(一)
  16. Windows下控制鼠标移动和点击的C语言实现
  17. ISO 8601 utc 时间
  18. ps怎么自定义dialog的样式跟输入框
  19. “写入缓存失败”的八个最常见的原因
  20. 【libuv高效编程】libuv学习超详细教程1——libuv的编译与安装

热门文章

  1. CSDN博客的安全性为什么一直如此薄弱?
  2. 程序间数据共享与传递(2):EXPORT/IMPORT、SAP/ABAP Memory
  3. 浅谈ATP检查中的“确认可用部分数量”(一)
  4. ABAP数字类型合法性检查函数NUMERIC_CHECK
  5. Top 10 Things I Know for Sure-深信不疑的十大哲理
  6. 什么是BS结构、CS结构、RIA结构程序
  7. SAP设置信贷控制范围有什么作用?
  8. 为何要把你的SAP运行在Oracle数据库上?
  9. 关于信用管理--信用更新
  10. 数据集干货:一文读懂Mapsidejoin