机试题——通讯录合并

devtools/2025/3/4 10:16:37/

题目描述

你有一个通讯录,每个联系人包含姓名和手机号,一个联系人可能有多个手机号。如果两个联系人拥有相同的手机号,我们认为他们是同一个人。任务是整理通讯录,将具有相同手机号的联系人合并为一个联系人,并返回合并后的通讯录列表。如果合并时发现联系人姓名不同,以字典序小的为姓名。

输入描述

  1. 第一行:一个整数num,表示通讯录的记录数量(1 <= num <= 1000)。
  2. 接下来num行:每行表示一条联系人记录,包含姓名和若干电话号码(电话号码个数不超过10,长度在1到10之间)。姓名由英文字母大小写组成,长度在1到10之间。

输出描述

整理后的通讯录列表,其中具有相同手机号的联系人合并为一个联系人。输出联系人姓名和手机号码列表按ASCII码升序排序。

用例输入

4
kaka 10000000000 10000000001
tata 10000000020
kaka 10000000000 10000000002
tata 10000000010
kaka 10000000000 10000000001 10000000002
tata 10000000010
tata 10000000020

第一个kaka和第二个kaka有相同的手机号10000000000,因此他们被视为同一个人。合并后的手机号按ASCII码升序排序。

3
kaka 10000000000 10000000001
kaka 10000000001 10000000002
kaka 10000000002 10000000003
kaka 10000000000 10000000001 10000000002 10000000003

第一个kaka和第二个kaka有相同的手机号10000000001,第二个kaka和第三个kaka有相同的手机号10000000002,因此他们被视为同一个人。合并后的手机号按ASCII码升序排序。

解题思路

  1. 问题建模

    • 使用并查集来合并具有相同手机号的联系人。
    • 使用哈希表记录每个手机号对应的联系人索引。
    • 使用集合去重并排序手机号。
  2. 并查集

    • 对于每个联系人的手机号,如果该手机号已经出现过,则将当前联系人与之前出现的联系人合并。
    • 使用路径压缩优化并查集。
  3. 合并联系人

    • 对于每个联系人,找到其根节点(即合并后的代表)。
    • 合并手机号,去重并排序。
    • 如果姓名不同,选择字典序小的姓名。
  4. 输出结果

    • 按姓名和手机号的ASCII码升序排序,输出合并后的通讯录。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<algorithm>
#include<string>
#include<vector>
#include<unordered_map>
#include<unordered_set>
#include<queue>
#include<set>
#include<list>
#include<sstream>
#include<bitset>
#include<stack>
#include<climits>
#include<iomanip>
#include<cstdint>
using namespace std;// 并查集
vector<int> f(10005);
int find(int x) {if (f[x] == x) return x;else return f[x] = find(f[x]);
}
void un(int x, int y) {int fx = find(x);f[fx] = y;
}int main() {ios::sync_with_stdio(false);  // 关闭与 C 的同步cin.tie(nullptr);             // 解除 cin 与 cout 的绑定int n;cin >> n;cin.ignore();vector<string> name(n);vector<vector<string>> phone(n);map<string, int> memo; // 记录手机号对应的联系人索引for (int i = 0; i < n; i++) {f[i] = i; // 初始化并查集string input, temp;getline(cin, input);istringstream is(input);is >> name[i];while (is >> temp) {if (memo.count(temp)) { // 如果手机号已经出现过un(memo[temp], i); // 合并两个联系人}memo[temp] = i; // 更新手机号对应的联系人索引phone[i].push_back(temp); // 记录当前联系人的手机号}}// 开始合并map<int, vector<int>> unio; // 父节点和其子集map<string, vector<vector<string>>> res; // 一个名字可能对应多个通讯录号for (int i = 0; i < n; i++) {int cf = find(i); // 找到当前联系人的根节点unio[cf].push_back(i); // 合并到同一个集合}// 排序并输出结果for (auto& f : unio) {string cur_name;set<string> cur_phone; // 去重并排序手机号for (int c : f.second) {// 查询当前集合的名字最小值if (cur_name.size() == 0)cur_name = name[c];elsecur_name = min(cur_name, name[c]);// 合并当前联系人的所有手机号for (int i = 0; i < phone[c].size(); i++) {cur_phone.insert(phone[c][i]);}}vector<string> v_phone(cur_phone.begin(), cur_phone.end());res[cur_name].push_back(v_phone); // 保存结果}// 按姓名和手机号的ASCII码升序排序for (auto& t : res) {sort(t.second.begin(), t.second.end());for (auto c : t.second) {cout << t.first;for (int i = 0; i < c.size(); i++)cout << " " << c[i];cout << "\n";}}return 0;
}

http://www.ppmy.cn/devtools/164428.html

相关文章

HiRT:利用分层机器人Transformer 增强机器人控制

25年2月来自清华、伯克利分校和上海姚期智研究院的论文“HiRT: Enhancing Robotic Control with Hierarchical Robot Transformers”。 大型视觉-语言-动作 (VLA) 模型利用强大的预训练视觉-语言模型 (VLM) 后端&#xff0c;由于其深刻的泛化能力而在机器人控制方面显示出良好…

实现用户特征自动识别和动态圈子创建,需构建一套完整的自动化流程

实现用户特征自动识别和动态圈子创建&#xff0c;需构建一套完整的自动化流程&#xff0c;涵盖数据采集、特征工程、聚类分析、动态更新等环节。以下是分阶段技术方案&#xff1a; 一、核心架构设计 graph TDA[用户行为日志] --> B(实时特征提取)A --> C(离线特征仓库)B…

Notpad++通过SFTP连接ubuntu20.04实现windows下文件修改

第一步&#xff1a;开启ubuntu20.04下的22端口 sudo apt update sudo apt install vsftpd sudo nano /etc/vsftpd.conf 修改&#xff1a; listenYES # 将此行修改为 listenYES 如果需要直接监听端口21 我这里默认监听20端口进行数据传输 再安装 sudo apt install open…

03 HarmonyOS Next仪表盘案例详解(二):进阶篇

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; 文章目录 前言1. 响应式设计1.1 屏幕适配1.2 弹性布局 2. 数据展示与交互2.1 数据卡片渲染2.2 图表区域 3. 事件处理机制3.1 点击事件处理3.2 手势…

Kafka实现事务的机制

1. Kafka中事务的几个基本概念 Kafka 事务主要由 生产者&#xff08;Producer&#xff09; 来实现&#xff0c;核心概念包括&#xff1a; TransactionalId&#xff1a;事务 ID&#xff0c;Kafka 用它来唯一标识一个事务。Transaction Coordinator&#xff1a;事务协调器&…

基于SpringBoot的“数据驱动的资产管理系统站”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“数据驱动的资产管理系统站”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 局部E-R图 系统登录界…

图数据库Neo4j面试内容整理-图的聚类与社区检测

图的聚类与社区检测 是图分析中两个非常重要的任务,尤其是在社交网络、推荐系统、信息传播等领域中。通过这些技术,我们可以发现图中的潜在结构和模式,例如社交网络中的社区、学术论文中的研究领域等。社区检测和聚类有助于揭示图中节点的群体结构,进而挖掘出有价值的模式和…

特征分解(Eigen decomposition)在深度学习中的应用与理解

特征分解在深度学习中的应用与理解 特征分解&#xff08;Eigendecomposition&#xff09;是线性代数中的一个核心工具&#xff0c;在深度学习领域有着广泛的应用&#xff0c;尤其是在涉及矩阵操作和概率模型时。对于研究者来说&#xff0c;理解特征分解不仅有助于掌握数学基础…