List

8 篇文章 0 订阅
5 篇文章 0 订阅

编程题#1 List

来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

注意:总时间限制: 4000ms 内存限制: 65536kB

描述

写一个程序完成以下命令:

new id ——新建一个指定编号为id的序列(id<10000)

add id num——向编号为id的序列加入整数num

merge id1 id2——合并序列id1id2中的数,并将id2清空

unique id——去掉序列id中重复的元素

out id ——从小到大输出编号为id的序列中的元素,以空格隔开

输入

第一行一个数n,表示有多少个命令( n<=200000)。以后n行每行一个命令。

输出

按题目要求输出。

解题思路:从标准输入读入数据,并把它对应到相应的操作,这里先输入整数n表示要输入的命令数,然后用for循环依次输入命令,用if判断对应相应的命令操作。分5个判断分别进行new,add,merge,uniqueout操作,对adduniquemerge,分别调用listuniquemergepush_back函数。在new中,用关联容器map,容器的关键字为int型,值类型为list<int>

源代码

#include<iostream>

#include<list>

#include<vector>

#include<string>

#include<map>

using namespacestd;

 

int main()

{

    map<int, list<int>> s;

    intn;

    cin>> n;

    staticintsum = 0;

    for(inti = 0; i < n; i++)

    {

        string c;

        cin>> c;

        if(c == "new")

        {

 

            intid;

            cin>> id;

            sum++;

            s.insert(make_pair(id,list<int>()));

 

 

        }

        if(c == "add")

        {

            intid;

            intnum;

            cin>> id >> num;

            s[id].push_back(num);

        }

        if(c == "merge")

        {

            intid1, id2;

            cin>> id1 >> id2;

            s[id1].merge(s[id2]);

        }

        if(c == "unique")

        {

            intid;

            cin>> id;

            s[id].sort();

            s[id].unique();

 

        }

        if(c == "out")

        {

            intid;

            cin>> id;

            list<int>::const_iterator i;

            if(s[id].size() > 0)

            {

                s[id].sort();

                i= s[id].begin();

                cout<< *i;

                i++;

                for(; i != s[id].end(); i++)

                    cout<< ' ' << *i;

                cout<< endl;

            }

            elsecout << endl;

        }

    }

    return0;

}

 

 

注:之前用vector容器实现,代码虽然能通过POJ,但是若是乱序添加序列

如在执行以下命令后:

new 4

new 1

再执行添加操作,如:

Add 4 4

则显示错误,原因是因为在FindList方法中没有解决乱序添加序列后怎样查找地址的,则表示一下代码只能实现从1开始递增加1添加序列后的查找。而本人无法用vector实现乱序添加序列后怎样正确查找地址,所以才改用map实现。

#include<iostream>

#include<list>

#include<vector>

#include<string>

using namespacestd;

 

list<int>&FindList(vector<list<int>>&l, intid)

{

    inttemp = l.size();

    vector<list<int>>::iterator p;

    p = l.begin();

    return*(p + id - 1);

}

 

int main()

{

    vector<list<int>>s;

    intn;

    cin>> n;

    staticintsum = 0;

    for(inti = 0; i < n; i++)

    {

        string c;

        cin>> c;

        if(c == "new")

        {

 

            intid;

            cin>> id;

            sum++;

            s.push_back(list<int>());

            /*s[sum].push_front(id);*/

           

           

        }

        if(c == "add")

        {

            intid;

            intnum;

            cin>> id >> num;

            list<int>&temp = FindList(s, id);

            temp.push_back(num);

            temp.sort();

        }

        if(c == "merge")

        {

            intid1,id2;

            cin>> id1 >> id2;

            list<int>&temp1 = FindList(s, id1);

            list<int>&temp2 = FindList(s, id2);

            temp1.merge(temp2);

            temp1.sort();

        }

        if(c == "unique")

        {

            intid;

            cin>> id;

            list<int>&temp = FindList(s, id);

            temp.unique();

 

        }

        if(c == "out")

        {

            intid;

            cin>> id;

            list<int>&temp = FindList(s, id);

            if(temp.size() > 0)

            {

                list<int>::iterator i;

                for (i =temp.begin(); i != temp.end(); i++)

                    cout<< *i << " ";

            }

            cout<< endl;

        }

    }

    return0;

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值