你有一个通讯录,其中每个联系人包含姓名和多个手机号。如果两个联系人拥有相同的手机号,认为他们是同一个人,需要将其合并。如果合并时发现姓名不同,则保留字典序较小的姓名。通讯录中记录的手机号最多有10个,且每个手机号由1到10位数字组成。输入第一行为记录数量,接下来每行为一条联系人记录,包含姓名和若干手机号,手机号之间用空格隔开。输出时,整理后的通讯录需要按姓名字典序排列,同一联系人的手机号也按升序排列。
1.基于共享电话号码的联系人属于同一组的思路,我们可以先使用哈希表将电话号码映射到对应的联系人编号列表上,然后使用并查集将共享同一电话号码的联系人合并到同一组。
2.对于并查集里的每个组(用该集合中的root节点编号表示),我们需要找到字典序最小的联系人姓名和该组内的联系人的所有电话号码。
本题为2024年10月12日-华为国内机考原题
华为机考的介绍点击这里
你有一个通讯录,这个通讯录里每个联系人都包含姓名和手机号,一个联系人可能有多个手机号。
如果发现两个联系人拥有相同的手机号,我们就认为他们是同一个人。
你的任务就是整理这个通讯录,将具有相同手机号的联系人合并为一个联系人,并返回合并后的通讯录列表。
注意:用例不保证具有相同手机号的联系人姓名肯定是相同的,如果合并的时候发现联系人姓名不同,那么以字典序小的为姓名。
第一行表示通讯录的记录数量num,值的范围[1,1000]。
从第二行开始,每一行代表一条联系人记录,每条录包括姓名和若干电话号码,电话号码的个数不超过10(姓名由英文字母大小写组成,长度在1到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”,因此他们被视为同一个人。
因此kaka一共有三个号码并按ASCII码升级排序结果是10000000000 10000000001 10000000002。
第一个tata和第二个tata没有相同的号码,因此被视作两个人。
输入
3
kaka 10000000000 10000000001
kaka 10000000001 10000000002
kaka 10000000002 10000000003
输出
kaka 10000000000 10000000001 10000000002 10000000003
说明
在这个通讯录中,第一个kaka和第二个kaka有相同的手机号“10000000001”,第二个kaka和第三个kaka有相同的手机号“10000000002”,因此题目被视为同一个人。
因此kaka一共有四个号码并按ASCII码升级排序结果是10000000000 10000000001 10000000002 10000000003