有一些账号,账号里面有一个或多个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);
} }