华为2021-4-7笔试 第一题
题目:
第一行输入N, 0<N<=100000 第一行输入N,0<N<=100000接下来是N行代表每个小朋友希望和谁分到一组,如"John Jack", 代表 接下来是N行代表每个小朋友希望和谁分到一组,如“John Jack”,代表John希望和Jack分到-组,两个名字之间以空格分割,名字本身不存在空 约翰希望和杰克分到-组,两个名字之间以空格分割,名字本身不存在空格。
示例:
输入
6
Jack Tom
Alice John
Jessica Leonie
Tom Alice
John Jack
Leonie Jessica
输出
2
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 }
· 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应用必不可少的技术