PAT甲级题目翻译+答案 AcWing(链表)
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(链表)相关推荐
- PAT甲级题目翻译+答案 AcWing(数学)
1059 Prime Factors (25 分) 题意 : 给一正整数,要求分解质因数 思路 : 使用is_first,来完成除了第一个质因数前都有*的效果 如果n=1,要特判 最后如果n>1 ...
- PAT甲级题目翻译+答案 AcWing(排序)
1012 The Best Rank (25 分) 题意 :给ID和3门成绩,计算其平均分A,输出每位学生最好的排名,A>C>M>E 思路 :如果将所需的若干个元素中使第一个元素为后 ...
- PAT甲级题目翻译+答案 AcWing(模拟)
1008 Elevator (20 分) 思路 :last可能等于cur,而无论是否相等,res都是+5的 #include <iostream>using namespace std;i ...
- PAT甲级题目翻译+答案 AcWing(动态规划)
1007 Maximum Subsequence Sum (25 分) 题意 :注意最后输出的不是索引而是在那个索引的数 思路 :f为当前的假设开始指针,每一次累加到sum,如果sum大于res,就更 ...
- PAT甲级题目翻译+答案 AcWing(图论)
1003 Emergency (25 分) 题意 :求无向图中最短路的数量,以及在最短路情况下,点权之和最大是多少 思路 :dijkstra的扩展一般在第三步"用t更新其它点":s ...
- PAT甲级题目翻译+答案 AcWing(进位制)
1010 Radix (25 分) 题意 :radix进制 题意 :给两个数和其中一个数的进制,问另一个数能否在某一进制下与这数相等 思路 :如果tag等于2就交换,最后还是只需要处理tag为1这种情 ...
- PAT甲级题目翻译+答案 AcWing(字符串处理)
1001 A+B Format (20 分) 题意 :将整数转换成标准格式 思路 :从后往前遍历字符串进行模拟,每三个数字加一个逗号,但不能是在最前面加逗号,也不能是加在负号后面 #include & ...
- PAT甲级题目翻译+答案 AcWing(树)
1004 Counting Leaves (30 分) 题意 : 家庭关系可以用家谱树来表示,给定一个家谱树,你的任务是找出其中没有孩子的成员. 第一行包含一个整数 N 表示树中结点总数以及一个整数 ...
- PAT甲级题目翻译+答案 AcWing(基础算法与数据结构)
1029 Median (25 分) 题意 : median中位数 给两个升序的序列,要求它们两个合并后的中位数 思路 : 双指针 语法 : long int #include <iostrea ...
最新文章
- linux grep命令总结
- envi中的sg滤波_ENVI滤波
- Navicat远程服务器2013-Lost connection to MYSQL server at 'reading for initial communication packet' 公钥
- python错误代码提示手册_腾讯大佬整理了 Python 所有内置异常,Python高手必备的排错手册...
- Lesson4 一阶方程代换法
- 【Latex】数学公式排版
- c#调用python的四种方法
- 1055: 兔子繁殖问题 这是一个有趣的古典数学问题,著名意大利数学家Fibonacci曾提出一个问题:有一对小兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。
- Linux下shell显示用户名和主机名
- 人大金仓国产化数据库适配
- 腾讯2019技术岗笔试 猜硬币 众所周知,每一枚硬币都有两面,假定投掷一枚硬币,得到正面和反面的概率是一样的。小Q有一天和好朋友在玩投掷硬币的游戏,他投了n枚硬币,已知至少有p正,q反,求n枚硬币
- 2019智能手表推荐_智能手表什么牌子好,智能手表排行榜2020
- [图文]解读《碟中谍4》中的人脸识别技术
- nginx使用ngx.req.get_body_data()获取不到请求体内容
- 计算机的隐藏小秘密,手机里隐藏的小秘密,不看真的会后悔!(一)
- Windows下控制鼠标移动和点击的C语言实现
- ISO 8601 utc 时间
- ps怎么自定义dialog的样式跟输入框
- “写入缓存失败”的八个最常见的原因
- 【libuv高效编程】libuv学习超详细教程1——libuv的编译与安装