华为2019秋招笔试Java实现(6)
笔试日期2019年8月21日
第三题(300分)
题目描述
在通讯软件中,在群里面转发消息可以使得一条消息扩散到很多人那里。假设已知有m个群,其中一个人把消息发到他自己所在的所有群里面,这些群里面的每个人又把消息再次转发到他所有的群里面,请问所有群的人都转发过一次后,最后几个人收到该消息(包括发消息的人)?输出收到消息的人数(以十进制整数输出,不需要加换行符)。
输入描述
发第一条消息的人名
群组个数m
群组1成员人名列表
群组2成员人名列表
…
群组m成员人名列表
人名是英文字符串,包含字母和空格,最大长度不超过100字符。
群组成员人名列表包含1至多个人名,两个人名之间以逗号分隔。
输出描述
以十进制输出最后能收到消息的人数。
包括第一个发消息的人也统计进去,重复接收到消息只统计一次。
示例
输入
Jack
3
Jack,Tom,Anny,Lucy
Tom,Danny
Jack,Lily
输出
6
分析
这一题可以认为是广度优先问题,即从开始的群出发,找到可以到达的所有群。
起点:开始的人可以确定起始的群(一个、多个或没有出发点)
传递:从一开始的群传递到下一波群,直到没有新的群加入传递(传递条件是群之间有相同的人)
目标:被传递的所有群合并在一起,按名字计数
总的来说这题难度不大,并不涉及复杂的算法,只要识别出问题类型,剩下的就是熟练度的问题了。
解答
import java.util.*;
public class Main3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String start = sc.next();
int n = sc.nextInt();
sc.nextLine()