欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

基础训练——合并电话簿

发布时间:2023/12/15 编程问答 56 豆豆
生活随笔 收集整理的这篇文章主要介绍了 基础训练——合并电话簿 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

问题描述

有两本电话簿,现在要合并两个电话簿成为新的电话簿,使新的电话簿无冗余信息。

输入

有两本电话簿进行合并,使合并后仍按姓以字典序升序排列。首先输出合并后的个人数据的总数,接着输出个人信息。如果两本电话簿的个人数据完全一致,贼保留一个。如果两个姓相同,那么先出现的人仍在前。

输入样例

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; }

 

转载于:https://www.cnblogs.com/xiaonuolen/p/10597599.html

总结

以上是生活随笔为你收集整理的基础训练——合并电话簿的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。