编程题#1 List
来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)
注意:总时间限制: 4000ms 内存限制: 65536kB
描述
写一个程序完成以下命令:
new id ——新建一个指定编号为id的序列(id<10000)
add id num——向编号为id的序列加入整数num
merge id1 id2——合并序列id1和id2中的数,并将id2清空
unique id——去掉序列id中重复的元素
out id ——从小到大输出编号为id的序列中的元素,以空格隔开
输入
第一行一个数n,表示有多少个命令( n<=200000)。以后n行每行一个命令。
输出
按题目要求输出。
解题思路:从标准输入读入数据,并把它对应到相应的操作,这里先输入整数n表示要输入的命令数,然后用for循环依次输入命令,用if判断对应相应的命令操作。分5个判断分别进行new,add,merge,unique,out操作,对add,unique,merge,分别调用list的unique,merge,push_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;
}