基础训练——合并电话簿
Posted xiaonuolen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础训练——合并电话簿相关的知识,希望对你有一定的参考价值。
问题描述
有两本电话簿,现在要合并两个电话簿成为新的电话簿,使新的电话簿无冗余信息。
输入
有两本电话簿进行合并,使合并后仍按姓以字典序升序排列。首先输出合并后的个人数据的总数,接着输出个人信息。如果两本电话簿的个人数据完全一致,贼保留一个。如果两个姓相同,那么先出现的人仍在前。
输入样例
2
Dupont Albert Paris 45247000
Smith John Washington 18554420
3
Brown Gordon London 44863654
Martin Martin Troyes 25452829
Popov Nikolai Moscow 18222931
输出
5
Brown Gordon London 44863654
Dupont Albert Paris 45247000
Martin Martin Troyes 25452829
Popov Nikolai Moscow 18222931
Smith John Washington 18554420
思路
试了下重新改写set的规则,来保证数据的唯一性,同时插入后就直接保存在set中 自动按设置的规则排序。
代码
#include<cstdio> #include<iostream> #include<set> #include<cstring> using namespace std; struct Person{ char number[1000];//电话号码 int qz;//权重 bool operator < (const struct Person & pre) const{//重构<符号 if(strcmp(this->number,pre.number)==0){//自定义去重 如果一模一样那么就去重 return true; } else{//如果不一样判定姓是不是相同 bool isBool = false; int len=0; for(len=0;len<strlen(this->number);len++){//逐个判断 if(this->number[len]!=pre.number[len]){ isBool = false; break; } if(this->number[len]==‘ ‘){//空格结束 break; } } if(isBool == true){//如果姓一样那么按输入的权重来排 return this->qz < pre.qz; } else{ return strcmp(this->number,pre.number)<0;//如果前面的比后面的小 那么返回-1 } } } }; int main(){ int n; int m; Person p; scanf("%d",&n); int i=0; set<Person> mySet; getchar(); for(i=0;i<n;i++){ gets(p.number); p.qz = i; mySet.insert(p); } scanf("%d",&m); getchar(); for(i;i<m+n;i++){ gets(p.number); p.qz = i; mySet.insert(p); } cout<<mySet.size()<<endl; for(set<Person>::iterator it=mySet.begin();it!=mySet.end();it++){ cout<<it->number<<endl; } return 0; }
以上是关于基础训练——合并电话簿的主要内容,如果未能解决你的问题,请参考以下文章