华为2021-4-7笔试 第一题

题目:

第一行输入N, 0<N<=100000 第一行输入N,0<N<=100000接下来是N行代表每个小朋友希望和谁分到一组,如"John Jack", 代表 接下来是N行代表每个小朋友希望和谁分到一组,如“John Jack”,代表John希望和Jack分到-组,两个名字之间以空格分割,名字本身不存在空 约翰希望和杰克分到-组,两个名字之间以空格分割,名字本身不存在空格。 

示例:

输入 

Jack Tom 

Alice John 

Jessica Leonie

Tom Alice 

John Jack 

Leonie Jessica

输出

复制代码
 1 //利用图的深度优先遍历,统计结点之间有边且都未访问过
 2 
 3 import java.util.HashMap;
 4 import java.util.LinkedList;
 5 import java.util.Scanner;
 6 
 7 public class Main1 {
 8       static class Node{
 9           LinkedList<Node> edges=new LinkedList<>(); //存放与这个结点有边的结点
10           boolean visit =false;    //判断是否遍历
11         }
12         static int n;
13         static HashMap<String,Node> nodes;
14 
15         public  static void dfs(Node node){
16             node.visit=true;
17             for (Node edge:node.edges
18                  ) {
19                 if(!edge.visit){
20                     dfs(edge);
21                 }
22             }
23     }
24 
25     public static void main(String[] args) {
26         Scanner scanner=new Scanner(System.in);
27         n=scanner.nextInt();
28         scanner.nextLine();
29         nodes=new HashMap<String,Node>(n);  //判断是否已经统计了这个结点
30         for (int i = 0; i < n; i++) {
31             String s=scanner.nextLine();
32             String[] names=s.split(" ");
33             Node a,b;
34             //判断a,b节点是否已存在
35             if(!nodes.containsKey(names[0])){
36                 a=new Node();
37                 nodes.put(names[0],a );
38 
39             }else {
40                 a=nodes.get(names[0]);
41             }
42             if(!nodes.containsKey(names[1])){
43                 b=new Node();
44                 nodes.put(names[1],b );
45 
46             }else {
47                 b=nodes.get(names[1]);
48             }
49 
50             //a,b之间有边
51             a.edges.add(b);
52             b.edges.add(a);
53         }
54 
55         int count =0;
56         for (String s:nodes.keySet()
57              ) {
58 
59             Node node=nodes.get(s);
60             if(!node.visit){
61                 dfs(node);
62                 count++;
63             }
64         }
65 
66         System.out.println(count);
67 
68     }
69 }
复制代码

 

posted @   堤苏白  阅读(191)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示