zoukankan      html  css  js  c++  java
  • G面经prepare: Friends Recommendation

    想想如果你用linkedin或者facebook, 给你一个人和他的朋友关系网,你会怎么给一个人推荐朋友

    一个例子就是A-B, A-C, B - D, B - E, C - D,这个时候问我应该推荐谁给A,我说D,因为他是BC的共同好友,而E只是B的好友,到这我才明白干啥,就是给一个图和里面的一个节点A,用bfs从A出发,找出第二层中indegree度数最大节点

    用HashMap<Character, HashSet<Character>>来建图

    用HashMap<Character, Integer> SndIndegree来表示第二层indegree数目

    用maxIndegree记录第二层Indegree最大值

    用res记录第二层Indegree最大者

    BFS

     1 package FriendRecommendation;
     2 import java.util.*;
     3 
     4 public class Solution {
     5     public char recommend(char tar, char[][] arr) {
     6         HashMap<Character, HashSet<Character>> graph = new HashMap<Character, HashSet<Character>>();
     7         HashMap<Character, Integer> SndIndegree = new HashMap<Character, Integer>();
     8         
     9         
    10         //build graph
    11         for (char[] edge : arr) {
    12             if (!graph.containsKey(edge[0])) graph.put(edge[0], new HashSet<Character>());
    13             if (!graph.containsKey(edge[1])) graph.put(edge[1], new HashSet<Character>());
    14             graph.get(edge[0]).add(edge[1]);
    15             if (!SndIndegree.containsKey(edge[0])) SndIndegree.put(edge[0], 0);
    16             if (!SndIndegree.containsKey(edge[1])) SndIndegree.put(edge[1], 0);
    17         }
    18         
    19         Queue<Character> queue = new LinkedList<Character>();
    20         HashSet<Character> visited = new HashSet<Character>();
    21         int level = 0;
    22         queue.offer(tar);
    23         visited.add(tar);
    24         int PNum = 1;
    25         int CNum = 0;
    26         int maxIndegree = 0;
    27         char res = '';
    28         while (!queue.isEmpty()) {
    29             char cur = queue.poll();
    30             PNum--;
    31             for (Character neigh : graph.get(cur)) {
    32                 if (level+1 == 2) {
    33                     if (neigh == tar) continue;
    34                     int curIndegree = SndIndegree.get(neigh)+1;
    35                     if (curIndegree > maxIndegree) res = neigh.charValue();
    36                     SndIndegree.put(neigh, curIndegree);
    37                 }
    38                 else { //not second level
    39                     if (!visited.contains(neigh)) {
    40                         queue.offer(neigh);
    41                         CNum++;
    42                         visited.add(neigh);
    43                     }
    44                 }
    45             }
    46             if (PNum == 0) {
    47                 PNum = CNum;
    48                 CNum = 0;
    49                 level++;
    50             }
    51         }
    52         return res;
    53     }
    54     
    55 
    56     /**
    57      * @param args
    58      */
    59     public static void main(String[] args) {
    60         // TODO Auto-generated method stub
    61         Solution sol = new Solution();
    62         char res = sol.recommend('A', new char[][]{{'A','B'},{'A','C'},{'B','D'},{'B','E'},{'C','D'},{'B','A'},{'C','A'}});
    63         System.out.println(res);
    64     }
    65 
    66 }
  • 相关阅读:
    Android+Eclipse+Java:在“正在启动 CrazySnake”期间发生了内部错误, java.lang.NullPointerException
    ActivityManager: Warning: Activity not started, its current task has been brought to the front 的的问题
    CLR via C#(15)--String,熟悉而又陌生
    CLR via C#(14)-可空值类型,关于?和??的故事
    CLR via C#(13)-浅谈事件
    CLR via C#(12)-委托Delegate
    CLR via C#(11)-无参属性、有参数属性(索引器)
    CLR via C#(10)-参数
    CLR via C#(09)-扩展方法
    CLR via C#(08)-操作符
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/5134843.html
Copyright © 2011-2022 走看看