PTA甲级—链表
1032 Sharing (25分)
回顾了下链表的基本使用,这题就是判断两个链表是否有交叉点。
我最开始的做法就是用cnt[]记录每个节点的入度,发现入度为2的节点即为答案。后来发现这里忽略了两个链表初始节点都是一样的情况,于是这里cnt[]的含义变为每个节点被引用的次数,当一个节点被引用两次就说明被两个链表同时引用。此时又通过了部分测试样例,可是测试样例5始终通过不了。后来偶然翻到一篇博客才恍然大悟,这里的节点可能不止包含两个单词,即可能有多个起点表示多个单词,而题目只是问你给定的两个单词有没有相同后缀,那之前的思路就不适用了。
正确的做法应当是先遍历第一个单词,给所有节点的引用次数+1;接着遍历第二个单词,同样给路径上的节点引用次数+1,发现有两次引用的节点即为答案。最后记得要控制输出的格式,这点在很多题目中都考察过
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <map>
#include <queue>
#include <vector>
#include <set>
#define ll long long
#define inf 0x3f3f3f
#define pii pair<int, int>
#define pb push_back
using namespace std;
const int maxn = 1e5+100;
struct node{
char data;
int nxt = -1;
}link[maxn];
int pa, pb, m, now, val, nextNode;
int cnt[maxn], res = -1;
int main(){
scanf("%d%d%d", &pa, &pb, &m);
while(m--){
scanf("%d %c %d", &now, &val, &nextNode);
link[now].data = val, link[now].nxt = nextNode;
}
while(pa!=-1) cnt[pa]++, pa = link[pa].nxt;
while(pb!=-1){
if(++cnt[pb]==2){
res = pb;
break;
}
pb = link[pb].nxt;
}
if(res==-1) printf("-1");
else printf("%05d", res);
}
Reference:
https://www.amoshuang.com/archives/774
https://blog.csdn.net/qq_39072627/article/details/107008104
1052 Linked List Sorting (25分)
题意对链表进行排序并输出。有了1032这题的经验,WA后很快就发现输入的数据不一定在都在链表中。修改过来后缝缝补补,很快就AC了,不过需要注意一些细节,不然也可能过不了
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <map>
#include <queue>
#include <vector>
#include <set>
#define ll long long
#define inf 0x3f3f3f
#define pii pair<int, int>
#define pb push_back
using namespace std;
const int maxn = 1e5+100;
pii g[maxn];
int n, pos, now, val, nextNode;
struct node{
int val, nxt;
}link[maxn];
int main(){
scanf("%d%d", &n, &pos);
for(int i = 1; i <= n; i++){
scanf("%d%d%d", &now, &val, &nextNode);
link[now] = {val, nextNode};
}
int t = 0;
while(pos!=-1) g[++t] = {link[pos].val, pos}, pos =link[pos].nxt;
sort(g+1, g+1+t);
printf("%d ", t);
if(t==0) printf("-1\n");
else{
printf("%05d\n", g[1].second);
for(int i = 1; i <= t; i++){
printf("%05d %d ", g[i].second, g[i].first);
if(i!=t) printf("%05d\n", g[i+1].second);
else printf("-1\n");
}
} }
Reference:
https://blog.csdn.net/qq_39072627/article/details/107009532
https://blog.csdn.net/LSC_333/article/details/91356270
1074 Reversing Linked List (25分)
按照给定的k值,链表每k个节点为一组翻转一次,我的思想是对的,但是实现的方法有点啰嗦不直观,导致WA后调试起来也很麻烦。后面参考别人的做法,记录整个链表翻转后的下标,直接输出即可
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <map>
#include <queue>
#include <vector>
#include <set>
#define ll long long
#define inf 0x3f3f3f
#define pii pair<int, int>
#define pb push_back
using namespace std;
const int maxn = 1e5+100;
pii g[maxn];
int n, pos, k, now, val, nextNode;
int res[maxn];
struct node{
int val, nxt;
}link[maxn];
int main(){
scanf("%d%d%d", &pos, &n, &k);
for(int i = 1; i <= n; i++){
scanf("%d%d%d", &now, &val, &nextNode);
link[now] = {val, nextNode};
}
int t = 0;
while(pos!=-1) g[t++] = {link[pos].val, pos}, pos =link[pos].nxt;
for(int i = 0; i <= t-1; i++) {
if(i<t-t%k) res[i] = (i/k)*k*2+k-1-i;
else res[i] = i;
}
for(int i = 0; i <= t-1; i++){
printf("%05d %d ", g[res[i]].second, g[res[i]].first);
if(i!=t-1) printf("%05d\n", g[res[i+1]].second);
else printf("-1\n");
}
}
Reference:
https://blog.csdn.net/qq_41325698/article/details/103466109
1097 Deduplication on a Linked List (25分)
题目要求去除链表上权值的绝对值相同的节点(只保留第一个),之后把未删除的节点按链表连接顺序输出,接着把被删除节点也按在原链中的顺序输出。
这题的意思我大概看懂了,强迫自己没有看翻译,因为正式考试的时候是不让翻译的,想着没过的话再看翻译,没想到一遍就过了,看懂题目意思后,用链表去模拟过程即可。然后感觉代码可以再写的简洁一点,原节点和处理后答案的存储可以都是用结构体或者是pair
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <map>
#include <queue>
#include <vector>
#include <set>
#define ll long long
#define inf 0x3f3f3f
#define pii pair<int, int>
#define pb push_back
using namespace std;
const int maxn = 1e5+100;
pii g[maxn], h[maxn];
int n, pos, now, val, nextNode;
bool vis[maxn];
struct node{
int val, nxt;
}link[maxn];
int main(){
scanf("%d%d", &pos, &n);
for(int i = 1; i <= n; i++){
scanf("%d%d%d", &now, &val, &nextNode);
link[now] = {val, nextNode};
}
int t1 = 0, t2 = 0;
while(pos!=-1) {
int data = link[pos].val;
// cout << data << " " << pos << endl;
if(!vis[abs(data)]) g[t1++] = {data, pos}, vis[abs(data)] = 1;
else h[t2++] = {data, pos};
pos =link[pos].nxt;
}
for(int i = 0; i < t1; i++) {
printf("%05d %d", g[i].second, g[i].first);
if(i!=t1-1) printf("%05d\n", g[i+1].second);
else printf("-1\n");
}
for(int i = 0; i < t2; i++) {
printf("%05d %d", h[i].second, h[i].first);
if(i!=t2-1) printf("%05d\n", h[i+1].second);
else printf("-1\n");
} }
PTA甲级—链表的更多相关文章
- PTA甲级1094 The Largest Generation (25分)
PTA甲级1094 The Largest Generation (25分) A family hierarchy is usually presented by a pedigree tree wh ...
- PTA L2-002 链表去重
题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805072641245184 第一次做链表题,有时间多看看 解释 ...
- PTA L2-002 链表去重 团体程序设计天梯赛-练习集
L2-002 链表去重(25 分) 给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉.即对每个键值 K,只有第一个绝对值等于 K 的结点被保留.同时,所有被删除的结点须被保存在另 ...
- PAT甲级 链表题_C++题解
链表处理 PAT (Advanced Level) Practice 链表题 目录 <算法笔记> 重点摘要:静态链表 1032 Sharing (25) 1052 Linked List ...
- PTA甲级B1061 Dating
目录 B1061 Dating (20分) 题目原文 Input Specification: Output Specification: Sample Input: Sample Output: 生 ...
- PTA 单链表分段逆转
6-9 单链表分段逆转 (25 分) 给定一个带头结点的单链表和一个整数K,要求你将链表中的每K个结点做一次逆转.例如给定单链表 1→2→3→4→5→6 和 K=3,你需要将链表改造成 3→2→1 ...
- PTA 求链表的倒数第m个元素
6-7 求链表的倒数第m个元素 (20 分) 请设计时间和空间上都尽可能高效的算法,在不改变链表的前提下,求链式存储的线性表的倒数第m(>)个元素. 函数接口定义: ElementType ...
- pta L2-002 链表去重 +散列表知识小普及+二进制取反补码运算
题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805072641245184: 废话:今天忙着学习新知识了,没怎 ...
- PTA 甲级 1139
https://pintia.cn/problem-sets/994805342720868352/problems/994805344776077312 其实这道题目不难,但是有很多坑点! 首先数据 ...
随机推荐
- Modbus仿真器 Modbus Poll 和Modbus Slave详细图文教程
Modbus Poll 是Witte Software公司开发的的Modbus主机仿真器,用于测试和调试Modbus从设备.软件支持ModbusRTU.ASCII.TCP/IP协议.支持多设备监控,可 ...
- 一文彻底理解IO多路复用
在讲解IO多路复用之前,我们需要预习一下文件以及文件描述符. 什么是文件 程序员使用I/O最终都逃不过文件. 因为这篇同属于高性能.高并发系列,讲到高性能.高并发就离不开Linux/Unix,因此这里 ...
- 【Java基础】Eclipse 和数组
Eclipse 和数组 Eclipse 安装和使用 ... 数组的概述 数组(Array):是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理. 数组相 ...
- 【剑指 Offer】07.重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 示例: 前序遍历 preorder = [3,9,20,15,7] 中序遍历 ...
- 详解Vue中的computed和watch
作者:小土豆 博客园:https://www.cnblogs.com/HouJiao/ 掘金:https://juejin.cn/user/2436173500265335 1. 前言 作为一名Vue ...
- js的函数-function
function函数 function的英文是[功能],[数] 函数:职责:盛大的集会的意思 在js里,就是函数的意思.在Java里叫做方法. 定义函数 function fun(参数){ //函数体 ...
- 【SpringBoot】Spring Boot 集成SwaggerAPI
Spring Boot 集成SwaggerAPI 文章目录 Spring Boot 集成SwaggerAPI Swagger 添加依赖 配置类 config 控制类 controller 接口测试 页 ...
- show slave status常用参数备忘
mysql> show slave status\G*************************** 1. row *************************** Slave_IO ...
- innobackupex: Connecting to MySQL server with DSN 'dbi:mysql
[root@ma src]# innobackupex --user=root /root/backup --no-timestamp InnoDB Backup Utility v1.5.1-xtr ...
- pandas数据分析API常用操作
1.导入数据 df = pd.read_csv( # 该参数为数据在电脑中的路径,可以不填写 filepath_or_buffer='/Users/Weidu/Desktop/sz000002.csv ...