有一些账号,账号里面有一个或多个email, 如果两个账号有共同的email,则认为这两个账号是同一个人,找出哪些账号是同一个人
输入是这样的:数字是用户,字母是邮箱,有很多人有多个邮箱,找出相同的用户
1- {x,y,z}
2-{x}
3-{a,b}
4-{y, z}
5-{b}
6-{m}
7-{t,b}

账号之间如果有公共email就连边,我觉得要用hashMap, 存(email, user) pair

如果当前user的某个email在hashMap里出现过,当时是user1, 就看user和user1是否connected,否的话就要union,根据Union Find

Union Find Based on Quick Union

 package fbOnsite;
import java.util.*;
class UnionFind{
int[] ids;
int count;
public UnionFind(int num) {
ids = new int[num];
Arrays.fill(ids, -1);
count = 0;
} public int find(int id) {
while (id != ids[id]) id = ids[id];
return id;
} public void union(int n1, int n2) {
int root1 = find(n1);
int root2 = find(n2);
ids[root2] = root1;
} public boolean isConnected(int n1, int n2) {
return find(n1) == find(n2);
}
} public class EmailUser {
public int commonUser(HashMap<Integer, List<Character>> map) {
int size = map.size();
UnionFind uf = new UnionFind(10);
HashMap<Character, Integer> emailToUser = new HashMap<Character, Integer>();
for (int user : map.keySet()) {
uf.ids[user] = user;
uf.count++;
List<Character> emailList = map.get(user);
for (Character eachEmail : emailList) {
if (!emailToUser.containsKey(eachEmail)) {
emailToUser.put(eachEmail, user);
}
else {
int oriUser = emailToUser.get(eachEmail);
if (!uf.isConnected(user, oriUser)) {
uf.union(oriUser, user);
uf.count--;
}
}
}
}
for (int elem : uf.ids)
System.out.print(elem);
return uf.count;
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
EmailUser sol = new EmailUser();
HashMap<Integer, List<Character>> map = new HashMap<Integer, List<Character>>();
map.put(0, new ArrayList<Character>());
map.put(1, new ArrayList<Character>());
map.put(2, new ArrayList<Character>());
map.put(3, new ArrayList<Character>());
map.put(4, new ArrayList<Character>());
map.put(5, new ArrayList<Character>());
map.put(6, new ArrayList<Character>());
map.get(0).add('x');
map.get(0).add('y');
map.get(0).add('z');
map.get(1).add('x');
map.get(2).add('a');
map.get(2).add('b');
map.get(3).add('y');
map.get(3).add('z');
map.get(4).add('b');
map.get(5).add('m');
map.get(6).add('t');
map.get(6).add('b');
int res = sol.commonUser(map);
System.out.println(res);
} }

FB面经Prepare: Email User的更多相关文章

  1. FB面经 Prepare: All Palindromic Substrings

    Given a string, calculate how many substring is palindrome. Ignore non-char characters. Ignore case; ...

  2. FB面经 Prepare: Task Schedule

    tasks has cooldown time, give an input task id array, output finish time input: AABCA A--ABCA output ...

  3. FB面经 Prepare: Make Parentheses valid

    给一组括号,remove最少的括号使得它valid 从左从右各scan一次 package fb; public class removeParen { public static String fi ...

  4. FB面经Prepare: Friends Recommendation

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

  5. FB面经Prepare: Dot Product

    Conduct Dot Product of two large Vectors 1. two pointers 2. hashmap 3. 如果没有额外空间,如果一个很大,一个很小,适合scan小的 ...

  6. FB面经prepare: Count the number of Vector

    给一个超级大的排好序的vector [abbcccdddeeee]比如,要求返回[{,a}, {,b}, {,c}, {,d}, {,e}......]复杂度要优于O(N) 分析: 如果是binary ...

  7. FB面经 Prepare: Largest Island

    Find largest island in a board package fb; public class LargestIsland { public int findLargestIsland ...

  8. FB面经prepare: task schedule II

    followup是tasks是无序的. 一开始是有序的,比如说1, 1, 2, 1,一定要先执行第一个task1,然后等task1恢复,再执行第2个task1,再执行task2..... follow ...

  9. FB面经prepare: Task Schedule

    每种task都有冷却时间,比如task1执行后,要经过interval时间后才能再次执行,求总共所需时间. 用HashMap保存每一个task的下一次可以开始执行的最早时间 package TaskS ...

随机推荐

  1. tensorflow安装-【老鱼学tensorflow】

    TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理.Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,Tensor ...

  2. 使用kubeadm创建kubernets集群

    参考:  http://docs.kubernetes.org.cn/459.html   https://blog.csdn.net/gui951753/article/details/833169 ...

  3. .net 本地日志的添加

    /// <summary> /// 写入日志到文本文件 /// </summary> /// <param name="userName">用户 ...

  4. LCA最近公共祖先

    不会 准备研究一波!!! #include<bits/stdc++.h> ; using namespace std; vector<int> g[maxn]; ][maxn] ...

  5. Petrozavodsk Summer-2017. Moscow IPT Contest

    A. A Place For My Head 留坑. B. New Divide 从高位到低位贪心,当这一位是$0$时,要尽量取$1$,维护高维后缀最小值进行判断即可. 时间复杂度$O((n+a)\l ...

  6. Petrozavodsk Summer-2016. Ural FU Dandelion Contest

    A. Square Function 留坑. B. Guess by Remainder 询问$lcm(1,2,3,...,n)-1$即可一步猜出数. 计算$lcm$采用分治FFT即可,时间复杂度$O ...

  7. 读取gzmt.csv文件,计算均值及概率

    问题: 读取gzmt.csv文件所有数据,选取收盘价格(倒数第二列),计算20天均值,权重取成交量(选做:时间权重为半衰期为15天):将该均值修剪为超过600的都设置为1000,并打印出该均值超过55 ...

  8. (18)0907_CSS选择器详解

    选择器的优先级(决定那个样式生效): important: > 内联样式 > id选择器> 类和伪类 > 元素选择器 > 通配选择器> 继承样式无优先级 最大    ...

  9. PHP 数组按多个字段排序

      $array1 = array(       0=>array('id'=>8,'name'=>'Apple','age'=> 18),       1=>array ...

  10. js_初识js_js基本语法和数据类型

    1.js基础 2.js.html.css运行在浏览器(客户端)的语言 java php运行在服务器端 js最初的目的:在客户端处理表单的验证操作 js的解释器被称为js引擎,为浏览器的一部分,最早是在 ...