基础训练——合并电话簿
生活随笔
收集整理的這篇文章主要介紹了
基础训练——合并电话簿
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題描述
有兩本電話簿,現在要合并兩個電話簿成為新的電話簿,使新的電話簿無冗余信息。
輸入
有兩本電話簿進行合并,使合并后仍按姓以字典序升序排列。首先輸出合并后的個人數據的總數,接著輸出個人信息。如果兩本電話簿的個人數據完全一致,賊保留一個。如果兩個姓相同,那么先出現的人仍在前。
輸入樣例
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
總結
以上是生活随笔為你收集整理的基础训练——合并电话簿的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国好声音2020年的播出时间是多少
- 下一篇: css3-11 如何改变背景图片的大小和