基础训练——合并电话簿

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

 

以上是关于基础训练——合并电话簿的主要内容,如果未能解决你的问题,请参考以下文章

4.3 合并重复的条件执行片段

android小知识点代码片段

Python代码阅读(第19篇):合并多个字典

Android代码片段

Android开发常用代码片段

Laravel - 将“电话”和“电话”合并到同一个字段中