想想如果你用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

 package FriendRecommendation;
import java.util.*; public class Solution {
public char recommend(char tar, char[][] arr) {
HashMap<Character, HashSet<Character>> graph = new HashMap<Character, HashSet<Character>>();
HashMap<Character, Integer> SndIndegree = new HashMap<Character, Integer>(); //build graph
for (char[] edge : arr) {
if (!graph.containsKey(edge[0])) graph.put(edge[0], new HashSet<Character>());
if (!graph.containsKey(edge[1])) graph.put(edge[1], new HashSet<Character>());
graph.get(edge[0]).add(edge[1]);
if (!SndIndegree.containsKey(edge[0])) SndIndegree.put(edge[0], 0);
if (!SndIndegree.containsKey(edge[1])) SndIndegree.put(edge[1], 0);
} Queue<Character> queue = new LinkedList<Character>();
HashSet<Character> visited = new HashSet<Character>();
int level = 0;
queue.offer(tar);
visited.add(tar);
int PNum = 1;
int CNum = 0;
int maxIndegree = 0;
char res = '\0';
while (!queue.isEmpty()) {
char cur = queue.poll();
PNum--;
for (Character neigh : graph.get(cur)) {
if (level+1 == 2) {
if (neigh == tar) continue;
int curIndegree = SndIndegree.get(neigh)+1;
if (curIndegree > maxIndegree) res = neigh.charValue();
SndIndegree.put(neigh, curIndegree);
}
else { //not second level
if (!visited.contains(neigh)) {
queue.offer(neigh);
CNum++;
visited.add(neigh);
}
}
}
if (PNum == 0) {
PNum = CNum;
CNum = 0;
level++;
}
}
return res;
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Solution sol = new Solution();
char res = sol.recommend('A', new char[][]{{'A','B'},{'A','C'},{'B','D'},{'B','E'},{'C','D'},{'B','A'},{'C','A'}});
System.out.println(res);
} }

G面经prepare: Friends Recommendation的更多相关文章

  1. G面经prepare: Set Intersection && Set Difference

    求两个sorted数组的intersection e.g. [1,2,3,4,5],[2,4,6] 结果是[2,4] difference 类似merge, 分小于等于大于三种情况,然后时间O(m+n ...

  2. G面经prepare: Reorder String to make duplicates not consecutive

    字符串重新排列,让里面不能有相同字母在一起.比如aaabbb非法的,要让它变成ababab.给一种即可 Greedy: 跟FB面经Prepare task Schedule II很像,记录每个char ...

  3. FB面经Prepare: Friends Recommendation

    有个getFriend() API, 让你推荐你的朋友的朋友做你的朋友,当然这个新朋友不能是你原来的老朋友 package fb; import java.util.*; public class R ...

  4. G面经prepare: Maximum Subsequence in Another String's Order

    求string str1中含有string str2 order的 subsequence 的最小长度 DP做法:dp[i][j]定义为pattern对应到i位置,string对应到j位置时,shor ...

  5. G面经prepare: Pattern Match

    设定一个pattern 把 'internationalization' 变成 'i18n', 比如word是house,pattern可以是h3e, 3se, 5, 1o1s1等, 给pattern ...

  6. G面经prepare: Data Stream Average

    给一个datastream和一个fixed window size, 让我design一个class可以完成add number还有find average in the window. 就是不能用v ...

  7. G面经prepare: Android Phone Unlock Pattern

    1 2 3 4 5 6 7 8 9 只有中间没有其他键的两个键才能相连,比如1可以连 2 4 5 6 8 但不能连 3 7 9 但是如果中间键被使用了,那就可以连,比如5已经被使用了,那1就可以连9 ...

  8. G面经prepare: Jump Game Return to Original Place

    第二题 算法 给你一个arr 返回 T 或者 F arr的每个数代表从这个点开始跳几部,返回T的情况:从这个arr中任意一个数开始跳,可以在每个元素都跳到且只跳到一次的情况下返回到开始跳的元素 比如[ ...

  9. G面经prepare: Sort String Based On Another

    Given a sorting order string, sort the input string based on the given sorting order string. Ex sort ...

随机推荐

  1. LR脚本技巧

    1.参数化空值       如上图所示,当参数化时某个值需要为空值(非空格),直接在参数化文件中空一行/格即可,虽然Parameter List界面上没有显示空的那一行,但并不影响取值. 2.手工日志 ...

  2. pureftpd安装配置[总结]

    http://www.ttlsa.com/linux/how-to-install-pureftpd/ 看了这篇文章[几个小坑]总结如下: 1.最重要的一点,代码不要复制,有些符号肉眼看不出来. ./ ...

  3. bug 发表文章不显示图片

    bug 描述: 现象是我们这不能发布图片, 测试说患教方向是可以正常发布图片的(还是要感激测试,正是他们鞭策我们不断挑战困难,解决之,从而提高自己姿势水平). 图片没上传上去, 服务端协助查找发现没调 ...

  4. 关于C和C++动态链接库的几个问题

    问题: 1.写一段C++程序,编译成动态链接库后,C程序怎么访问? 2.写一段C程序,编译成动态链接库后,C++程序怎么访问? 3.写一个类,编译成动态链接库后,里面的public变量能否访问? 对于 ...

  5. nRF51822之pstorage使用摘要

    https://devzone.nordicsemi.com/question/15271/how-can-i-write-10kb-of-data-to-internal-flash/?answer ...

  6. Cloudera CDH 、Impala本地通过Parcel安装配置详解及什么是Parcel

    本文引用自:Cloudera CDH .Impala本地通过Parcel安装配置详解及什么是Parcelhttp://www.aboutyun.com/forum.php?mod=viewthread ...

  7. go 安装

    安装golang centos7 直接安装golang yum install golang centos6需添加软件源,然后再安装 rpm -ivh http://ftp.riken.jp/Linu ...

  8. Java高级之类结构的认识

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! Java体系包括,各种版本的虚拟机,可执行文件,各种第三方类库,Java API类库,Java语言 ...

  9. 关于Bitcode的探索

    Bitcode概述         Bitcode is an intermediate representation of a compiled program. Apps you upload t ...

  10. spring3 mvc:方法返回值的学习

    新建后台代码用以测试返回类型,在这里我新建的如下: /** * 项目名称:Spring3mvc demo * Copyright ? 2010-2012 spartacus.org.cn All Ri ...