【PAT】1097. Deduplication on a Linked List

来源:互联网 发布:淘宝朵以专卖店 编辑:程序博客网 时间:2024/06/02 02:54
考查点:静态链表
思路:自己用单链表的方法但是超时,需要转化为数组,而不是使用next遍历
提交情况:第一次少输了一个数没运行出来,之后忘记改next节点
收获:静态链表的题还是不要尝试改动next为好,尽量转为数组,通过加一个变量

23分代码:

#define LOCAL#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <string>#include <vector>#include <map>#include <set>#include <queue>#define FOR(i, x, y) for(int i = x; i <= y; i++)#define rFOR(i, x, y) for(int i = x; i >= y; i--)#define MAXN 10005#define oo 0x3f3f3f3fusing namespace std;const int maxn=100010;struct Link{    int data;    int add;    int next;}node[maxn];int h[10010];int main(){    #ifdef LOCAL        freopen("data.in","r",stdin);        freopen("data.out","w",stdout);    #endif // LOCAL    int first,n;    scanf("%d%d",&first,&n);    int add;    for(int i=0;i<n;i++){        scanf("%d",&add);        scanf("%d%d",&node[add].data,&node[add].next);        node[add].add=add;    }    int p=first;    int pre=first;      int q=-1;    int qq;    while(p!=-1){        int k=abs(node[p].data);        h[k]++;        if(h[k]>1){            if(q==-1)qq=p;            if(q!=-1)node[q].next=p;            node[pre].next=node[p].next;            q=p;            p=node[p].next;        }else{            pre=p;p=node[p].next;        }    }    node[q].next=-1;    p=first;    while(p!=-1){        if(node[p].next!=-1)printf("%05d %d %05d\n",p,node[p].data,node[p].next);        else printf("%05d %d -1\n",p,node[p].data);        p=node[p].next;    }    while(qq!=-1){        if(node[qq].next!=-1) printf("%05d %d %05d\n",qq,node[qq].data,node[qq].next);        else printf("%05d %d -1",qq,node[qq].data);        qq=node[qq].next;    }    return 0;}

ac代码:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <string>#include <vector>#include <map>#include <set>#include <queue>using namespace std;const int maxn=100010;struct Link{    int data;    int add,order;    int next;}node[maxn];int h[10010];bool cmp(Link a,Link b){    return a.order<b.order;}int main(){    #ifdef LOCAL        freopen("data.in","r",stdin);        freopen("data.out","w",stdout);    #endif // LOCAL    int first,n,add;    for(int i=0;i<maxn;i++){        node[i].order=2*maxn;    }    scanf("%d%d",&first,&n);    for(int i=0;i<n;i++){        scanf("%d",&add);        scanf("%d%d",&node[add].data,&node[add].next);        node[add].add=add;    }    int cntv=0,cntr=0,p=first;    while(p!=-1){        if(h[abs(node[p].data)]==0){            h[abs(node[p].data)]++;            node[p].order=cntv++;        }else{            node[p].order=maxn+cntr++;        }        p=node[p].next;    }    sort(node,node+maxn,cmp);    int cnt=cntv+cntr;    for(int i=0;i<cnt;i++){        if(i!=cnt-1&&i!=cntv-1){            printf("%05d %d %05d\n",node[i].add,node[i].data,node[i+1].add);        }else{            printf("%05d %d -1\n",node[i].add,node[i].data);        }    }    return 0;}


0 0
原创粉丝点击