ECNU 3243 搜索联系人

ECNU 3243 搜索联系人

链接

https://acm.ecnu.edu.cn/problem/3243

题目

单点时限: 2.0 sec

内存限制: 256 MB

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

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

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

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

输出格式
对于每个问题,输出一行问题的编号( 开始编号,格式: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 989843

思路

老套路,不过时间限制有点难受,我修改了好几遍,换了几个方案。
首先用数组存放输入的数据,然后先筛选一下符合条件的,再加入,确保时间不超。
筛选的数目就是答案的数目,对list进行排序,字典序排序用了一个额外的函数,最后按格式输出即可。

代码

  public static class peo {

    public String name;
    public String tel;

    public peo(String name, String tel) {
      this.name = name;
      this.tel = tel;
    }
  }

  public static int zidian(String a, String b) {
    StringBuffer sb1 = new StringBuffer(a);
    StringBuffer sb2 = new StringBuffer(b);
    int len = Math.min(sb1.length(), sb2.length());
    for (int i = 0; i < len; i++) {
      char q = sb1.charAt(i);
      char w = sb2.charAt(i);
      if (q != w) {
        return q - w;
      }
    }
    return sb1.length() - sb2.length();
  }

  public static void fun() {
    Scanner sc = new Scanner(System.in);
    int t = sc.nextInt();
    for (int tt = 0; tt < t; tt++) {
      int n = sc.nextInt();
      ArrayList<peo> qwer = new ArrayList<>();
      String[] nn = new String[n];
      String[] tl = new String[n];
      for (int i = 0; i < n; i++) {
        nn[i] = sc.next();
        tl[i] = sc.next();
      }
      String need = sc.next();
      for (int i = 0; i < n; i++) {
        if (tl[i].contains(need)) {
          qwer.add(new peo(nn[i], tl[i]));
        }
      }
      qwer.sort((o1, o2) -> {
        if (!o1.name.equals(o2.name)) {
          return zidian(o1.name, o2.name);
        } else {
          return zidian(o1.tel, o2.tel);
        }
      });

      System.out.println("case #" + tt + ":");
      int count = qwer.size();
      System.out.println(count);
      for (int i = 0; i < count; i++) {
        System.out.println(qwer.get(i).name+" "+qwer.get(i).tel);
      }
    }
  }
posted @   cheng102e  阅读(72)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2020-01-29 Windows下MySQL的安装与配置
点击右上角即可分享
微信分享提示