PAT Basic 1075 链表元素分类(25) [链表]
题目
给定⼀个单链表,请编写程序将链表元素进⾏分类排列,使得所有负值元素都排在⾮负值元素的前⾯,⽽[0, K]区间内的元素都排在⼤于K的元素前⾯。但每⼀类内部元素的顺序是不能改变的。例如:给定链表为 18→7→-4→0→5→-6→10→11→-2,K为10,则输出应该为-4→-6→-2→7→0→5→10→18→11。
输⼊格式:
每个输⼊包含1个测试⽤例。每个测试⽤例第1⾏给出:第1个结点的地址;结点总个数,即正整数N(<= 105);以及正整数K (<=1000)。结点的地址是5位⾮负整数,NULL地址⽤-1表示。接下来有N⾏,每⾏格式为:
Address Data Next
其中Address是结点地址;Data是该结点保存的数据,为[-105, 105]区间内的整数;Next是下⼀结点的地址。题⽬保证给出的链表不为空。
输出格式:
对每个测试⽤例,按链表从头到尾的顺序输出重排后的结果链表,其上每个结点占⼀⾏,格式与输⼊相同。
输⼊样例:
00100 9 10
23333 10 27777
00000 0 99999
00100 18 12309
68237 -6 23333
33218 -4 00000
48652 -2 -1
99999 5 68237
27777 11 48652
12309 7 33218
输出样例:
33218 -4 68237
68237 -6 48652
48652 -2 12309
12309 7 00000
00000 0 99999
99999 5 23333
23333 10 00100
00100 18 27777
27777 11 -1
题目分析
已知N个结点,将值为负数的结点放置在非负节点之前,将小于等于k的结点放置在大于k的结点之前
解题思路
思路 01
- 用数组存放结点,用属性order记录结点在链表中的序号(初始化为3*maxn)
- 依次遍历链表中结点
2.1 如果结点值<0,结点序号设置为cnt1++
2.2 如果结点值>=0&&<=k,结点序号设置为maxn+cnt2++
2.3 如果结点值>k,结点序号设置为2*maxn+cnt3++ - 按照order排序,并依次打印
思路 02
- 用数组存放结点,用属性order记录结点在链表中的序号(初始化为3*maxn)
- 依次遍历链表中结点
2.1 依次遍历链表中结点,找到所有值<0的节点,存放于vector
2.2 依次遍历链表中结点,找到所有值>=0&&<=k的节点,存放于vector
2.3 依次遍历链表中结点,找到所有值>k的节点,存放于vector - 依次打印vector中结点
易错点
已知结点中存在无效结点(即不在链表中的结点)
Code
Code 01(最优)
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=100010;
struct node {
int adr;
int data;
int next;
int order=3*maxn;
} nds[maxn];
bool cmp(node &n1,node &n2) {
return n1.order<n2.order;
}
int main(int argc,char * argv[]) {
int hadr,n,k,adr;
scanf("%d %d %d",&hadr,&n,&k);
for(int i=0; i<n; i++) {
scanf("%d",&adr);
scanf("%d %d",&nds[adr].data,&nds[adr].next);
nds[adr].adr=adr;
}
int cnt1=0,cnt2=0,cnt3=0;
for(int i=hadr; i!=-1; i=nds[i].next) {
if(nds[i].data<0)nds[i].order=cnt1++;
if(nds[i].data>=0&&nds[i].data<=k)nds[i].order=maxn+cnt2++;
if(nds[i].data>k)nds[i].order=2*maxn+cnt3++;
}
sort(nds,nds+maxn,cmp);
int cnt=cnt1+cnt2+cnt3;
for(int i=0; i<cnt-1; i++) {
printf("%05d %d %05d\n",nds[i].adr,nds[i].data,nds[i+1].adr);
}
printf("%05d %d -1\n",nds[cnt-1].adr,nds[cnt-1].data);
return 0;
}
Code 02
#include <iostream>
#include <vector>
using namespace std;
const int maxn=100010;
struct node {
int adr;
int data;
int next;
} nds[maxn];
int main(int argc,char * argv[]) {
int hadr,n,k,adr;
scanf("%d %d %d",&hadr,&n,&k);
for(int i=0; i<n; i++) {
scanf("%d",&adr);
scanf("%d %d",&nds[adr].data,&nds[adr].next);
nds[adr].adr=adr;
}
vector<node> v,ans;
for(int i=hadr; i!=-1; i=nds[i].next) {
v.push_back(nds[i]);
}
for(int i=0; i<v.size(); i++) {
if(v[i].data<0)ans.push_back(v[i]);
}
for(int i=0; i<v.size(); i++) {
if(v[i].data>=0&&v[i].data<=k)ans.push_back(v[i]);
}
for(int i=0; i<v.size(); i++) {
if(v[i].data>k)ans.push_back(v[i]);
}
for(int i=0; i<ans.size()-1; i++) {
printf("%05d %d %05d\n",ans[i].adr,ans[i].data,ans[i+1].adr);
}
printf("%05d %d -1\n",ans[ans.size()-1].adr,ans[ans.size()-1].data);
return 0;
}
PAT Basic 1075 链表元素分类(25) [链表]的更多相关文章
- PAT Basic 1075 链表元素分类 (25 分)
给定一个单链表,请编写程序将链表元素进行分类排列,使得所有负值元素都排在非负值元素的前面,而 [0, K] 区间内的元素都排在大于 K 的元素前面.但每一类内部元素的顺序是不能改变的.例如:给定链表为 ...
- PAT——1075. 链表元素分类(25)
给定一个单链表,请编写程序将链表元素进行分类排列,使得所有负值元素都排在非负值元素的前面,而[0, K]区间内的元素都排在大于K的元素前面.但每一类内部元素的顺序是不能改变的.例如:给定链表为 18→ ...
- PAT(B) 1075 链表元素分类(Java)
题目链接:1075 链表元素分类 (25 point(s)) 题目描述 给定一个单链表,请编写程序将链表元素进行分类排列,使得所有负值元素都排在非负值元素的前面,而 [0, K] 区间内的元素都排在大 ...
- P1075 链表元素分类
P1075 链表元素分类 转跳点:
- PAT Basic 1075
1075 链表元素分类 给定一个单链表,请编写程序将链表元素进行分类排列,使得所有负值元素都排在非负值元素的前面,而 [0, K] 区间内的元素都排在大于 K 的元素前面.但每一类内部元素的顺序是不能 ...
- PAT 1075 链表元素分类
https://pintia.cn/problem-sets/994805260223102976/problems/994805262953594880 给定一个单链表,请编写程序将链表元素进行分类 ...
- 【PAT】B1075 链表元素分类(25 分)
这道题算有点难,心目中理想的难度. 不能前怕狼后怕虎,一会担心超时,一会又担心内存过大,直接撸 将三部分分别保存到vector 有意思的在于输出 分别输出第一个的add和num 中间输出nextadd ...
- PAT甲题题解-1032. Sharing (25)-链表水题
#include <iostream> #include <cstdio> #include <algorithm> #include <string.h&g ...
- PAT A1133 Splitting A Linked List (25) [链表]
题目 Given a singly linked list, you are supposed to rearrange its elements so that all the negative v ...
随机推荐
- Spring Cloud 支付宝支付的流程
沙箱环境又称沙盘,为了开发与调试所提供的环境,它与生产环境互相隔离,但具有生产环境几乎完全相同的功能蚂蚁金服开放平台——开发者中心1.https://openhome.alipay.com2.提供的调 ...
- 数论 CF27E Number With The Given Amount Of Divisors
求因子数一定的最小数(反素数) #include<iostream> #include<string> #include<cmath> #include<cs ...
- kafka的编程模型
1.kafka消费者编程模型 分区消费模型 组(group)消费模型 1.1.1.分区消费架构图,每个分区对应一个消费者. 1.1.2.分区消费模型伪代码描述 指定偏移量,用于从上次消费的地方开始消费 ...
- HDU - 2602 Bone Collector(01背包讲解)
题意:01背包:有N件物品和一个容量为V的背包.每种物品均只有一件.第i件物品的费用是volume[i],价值是value[i],求解将哪些物品装入背包可使价值总和最大. 分析: 1.构造二维数组: ...
- UVA - 12716 GCD XOR(GCD等于XOR)(数论)
题意:输入整数n(1<=n<=30000000),有多少对整数(a, b)满足:1<=b<=a<=n,且gcd(a,b)=a XOR b. 分析:因为c是a的约数,所以枚 ...
- 执行 composer update 命令的时候报 Your requirements could not be resolved to an installable set of packages. 错误
Your requirements could not be resolved to an installable set of packages. 以上原因:不匹配composer.json要求的版 ...
- HDU 5430:Reflect 欧拉函数
Reflect Accepts: 72 Submissions: 302 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/ ...
- 使用navicat连接mysql8.0.12版本 出现client does not support。。。解决办法
navicat版本的问题 出现连接失败的原因:mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password ...
- cmake 简易入门
目录结构 root -| |--**.cpp |--CmakeList.txt |--current path |--(执行cmake ../) |-- (执行make的目录) 步骤: 1 编写 Cm ...
- 1.3 this深度面试题
var big = "1" var obj = { big: "2", showBig: function() { return this.big }, } o ...