PAT-Deduplication on a Linked List

来源:互联网 发布:linux find size 编辑:程序博客网 时间:2024/05/22 12:09
  • 题意:给你n条记录,每天记录由一下三部分组成(地址,key,next_address),再给你一个起始地址。让你输出两个新的list,一个是将原来的list删除key的绝对值之后的list,一个是被删除元素组成的list,第一个被删除的元素就是该list 的首元素。
  • 解法:我们定义两个数组,一个用来记录key,一个用来记录next address, 数组的index就是当前的address。因为题中说明了address最多10^5,所以开个数组的内存还是可以的。在声明一个数组用来记录key是否出现过,题中也给出了key的范围10^4。最后定义两个vector,一个用来存放第一个list的address,一个用来存放第二个list的address,也就是被删除元素组成的list。
  • 代码如下所示:
#include <iostream>#include <cstring>#include <cstdio>#include <vector>#include <cmath>using namespace std;const int max_number_address = 99999;int record_key[max_number_address];int record_next[max_number_address];const int max_key = 1e+5;bool exists[max_key];int fabs(int x){    if(x<0)    {        return -x;    }    return x;}int main(){    freopen("/home/give/PAT/DeduplicationonaLinkedList.txt","r",stdin);    memset(exists, false, sizeof(exists));    int first_address,n;    cin>>first_address>>n;    for(int i=0;i<n;i++)    {        int address, key, next;        cin>>address>>key>>next;        record_key[address] = key;        record_next[address] = next;    }    int cur_address = first_address;    vector<int> used;    vector<int> unused;    for(int i=0;i<n;i++)    {        int cur_key = record_key[cur_address];        if(exists[fabs(cur_key)] == false)        {            used.push_back(cur_address);            exists[fabs(cur_key)] = true;        }else{            unused.push_back(cur_address);        }        cur_address = record_next[cur_address];    }    for(int i=0;i<used.size();i++)    {        cur_address = used[i];        int cur_value = record_key[cur_address];        int cur_next;        if(i==(used.size()-1))        {            cur_next = -1;            printf("%05d %d %d\n", cur_address, cur_value, cur_next);        }else{            cur_next = used[i+1];            printf("%05d %d %05d\n", cur_address, cur_value, cur_next);        }    }    for(int i=0;i<unused.size();i++)    {        cur_address = unused[i];        int cur_value = record_key[cur_address];        int cur_next;        if(i==(unused.size()-1))        {            cur_next = -1;            printf("%05d %d %d\n", cur_address, cur_value, cur_next);        }else{            cur_next = unused[i+1];            printf("%05d %d %05d\n", cur_address, cur_value, cur_next);        }    }}