EOJ #3243搜索联系人

题目描述:

你有一个通讯录,你想通过号码来搜索联系人,但是你可能只记得某个人号码的一个片段,现在给你一个通讯录列表和一个号码片段,你需要输出所有号码里面有这个号码片段的联系人的姓名。

输入格式:

第 1 行为一个整数T(1≤T≤15)为问题数。

每个问题按如下格式进行输入:

第一行是一个整数n,表示通讯录里面有n个联系人(n < 10000),接下来的n行,每行是一个姓名(长度不超过30,只包含小写英文字母)和一个手机号码(长度不超过11),姓名和手机号码中间有一个空格隔开。最后一行是一个号码片段(长度不超过11)。

输出格式:

对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等),然后第一行先输出一个整数表示符合条件的联系人个数,接下来每行输出一个联系人(空格隔开姓名和号码),请按姓名的字典序递增顺序输出所有满足条件的姓名和号码, 如果两个联系人姓名相同则按号码的字典序递增输出。 

Input
3
4
police 110
hospital 120
firepolice 119
nineoneone 911
11
14
rhgyptk 47242
brynx 66585778
kinyhpw 166021
uv 33
pr 584184
d 735517
ksodi 471831758
lgexsqtsf 088
bw 4
kn 62
crtsgidj 56760518
hwpfp 0840630
squsf 686
plwnpsix 80045
4
5
dsfd 989843
dfdfdf 34344
dsfd 324344545
erere 454545129
dsfd 2343
43
Output
case #0:
3
firepolice 119
nineoneone 911
police 110
case #1:
6
bw 4
hwpfp 0840630
ksodi 471831758
plwnpsix 80045
pr 584184
rhgyptk 47242
case #2:
4
dfdfdf 34344
dsfd 2343
dsfd 324344545
dsfd 98984

思路分析: 

定义结构体Dir保存联系人信息

typedef struct Node {
    string name;
    string phone;
} Dir;

遍历通讯录,查找满足所给字符串的电话号码保存。调用sort()函数对联系人及其联系方式按要求排序(按姓名的字典序递增顺序输出, 如果两个联系人姓名相同则按号码的字典序递增输出),自定义排序方式cmp()。

bool cmp(Node p, Node q) {
    if(p.name == q.name)
        return p.phone < q.phone;
    return p.name < q.name;
}

代码:

#include <bits/stdc++.h>
using namespace std;

typedef struct Node {
    string name;
    string phone;
} Dir;

bool cmp(Node p, Node q) {
    if(p.name == q.name)
        return p.phone < q.phone;
    return p.name < q.name;
}

int main() {
    int i, n, m;
    int num = 0;
    cin >> n;
    while(n--) {
        Dir dir1[1000], dir2[100];
        int loc, k = 0;
        string str;
        cin >> m;
        for(i = 0; i < m; i++) {
            cin >> dir1[i].name >> dir1[i].phone;
        }
        cin >> str;
        for(i = 0; i < m; i++) {
            loc = dir1[i].phone.find(str);
            if(loc >= 0) {
                dir2[k].name = dir1[i].name;
                dir2[k++].phone = dir1[i].phone;
            }
        }
        sort(dir2, dir2 + k, cmp);
        cout << "case #" << num++ << ":" << endl << k << endl;
        for(i = 0; i < k; i++) {
            cout << dir2[i].name << " " << dir2[i].phone << endl;
        }
    }
    return 0;
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值