Skip to content

Instantly share code, notes, and snippets.

@HuanxinHu
Created February 7, 2018 08:12
Show Gist options
  • Save HuanxinHu/a6a6c4fafee4f09d028bcf76e5533cac to your computer and use it in GitHub Desktop.
Save HuanxinHu/a6a6c4fafee4f09d028bcf76e5533cac to your computer and use it in GitHub Desktop.
JS Bin // source http://jsbin.com/vuwunotuza
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
</head>
<body>
<script id="jsbin-javascript">
/**
* @param {string[][]} accounts
* @return {string[][]}
*/
function DSU(){
var parent = new Array(8);
for(var i=0; i<8; i++){
parent[i] = i;
}
return {
find: function(x) {
console.log('find parent ' + parent.toString())
if(parent[x] !==x ){
parent[x] = this.find(parent[x]);
}
return parent[x];
},
union: function(x, y){
parent[this.find(x)] = this.find(y);
console.log('union parent ' + parent.toString())
}
}
}
var accountsMerge = function(accounts) {
if(!accounts || accounts.length===0) return [];
var dsu = DSU();
var emailToName = {};
var emailToID = {};
var id = 0;
for(var i=0; i<accounts.length; i++){
var account = accounts[i];
var name = account[0];
for(var j=1; j<account.length; j++){
var email = account[j];
emailToName[email] = name;
if(emailToID[email]===undefined) {
emailToID[email] = id++;
}
console.log('dsu-union '+ account[1] + ':' + emailToID[account[1]] + ' ' + email + ':'+ emailToID[email])
dsu.union(emailToID[account[1]], emailToID[email])
}
}
console.log(emailToID);
console.log(emailToName);
var ans = {};
Object.keys(emailToID).forEach(email => {
var index = dsu.find(emailToID[email]);
console.log('email - index: '+ email + ' - ' + index);
if(!ans[index]){
ans[index] = [email]
}else{
ans[index].push(email);
}
console.log('ans', ans);
});
Object.values(ans).forEach(list => {
list.sort();
list.unshift(emailToName[list[0]]);
});
return Object.values(ans);
};
var accounts = [
['hu', 'a', 'b', 'c'],
['hu', 'd', 'c', 'f'],
['he', 'e','k'],
['Le', 'm']
]
console.log(accountsMerge(accounts));
</script>
<script id="jsbin-source-javascript" type="text/javascript">/**
* @param {string[][]} accounts
* @return {string[][]}
*/
function DSU(){
var parent = new Array(8);
for(var i=0; i<8; i++){
parent[i] = i;
}
return {
find: function(x) {
console.log('find parent ' + parent.toString())
if(parent[x] !==x ){
parent[x] = this.find(parent[x]);
}
return parent[x];
},
union: function(x, y){
parent[this.find(x)] = this.find(y);
console.log('union parent ' + parent.toString())
}
}
}
var accountsMerge = function(accounts) {
if(!accounts || accounts.length===0) return [];
var dsu = DSU();
var emailToName = {};
var emailToID = {};
var id = 0;
for(var i=0; i<accounts.length; i++){
var account = accounts[i];
var name = account[0];
for(var j=1; j<account.length; j++){
var email = account[j];
emailToName[email] = name;
if(emailToID[email]===undefined) {
emailToID[email] = id++;
}
console.log('dsu-union '+ account[1] + ':' + emailToID[account[1]] + ' ' + email + ':'+ emailToID[email])
dsu.union(emailToID[account[1]], emailToID[email])
}
}
console.log(emailToID);
console.log(emailToName);
var ans = {};
Object.keys(emailToID).forEach(email => {
var index = dsu.find(emailToID[email]);
console.log('email - index: '+ email + ' - ' + index);
if(!ans[index]){
ans[index] = [email]
}else{
ans[index].push(email);
}
console.log('ans', ans);
});
Object.values(ans).forEach(list => {
list.sort();
list.unshift(emailToName[list[0]]);
});
return Object.values(ans);
};
var accounts = [
['hu', 'a', 'b', 'c'],
['hu', 'd', 'c', 'f'],
['he', 'e','k'],
['Le', 'm']
]
console.log(accountsMerge(accounts));</script></body>
</html>
/**
* @param {string[][]} accounts
* @return {string[][]}
*/
function DSU(){
var parent = new Array(8);
for(var i=0; i<8; i++){
parent[i] = i;
}
return {
find: function(x) {
console.log('find parent ' + parent.toString())
if(parent[x] !==x ){
parent[x] = this.find(parent[x]);
}
return parent[x];
},
union: function(x, y){
parent[this.find(x)] = this.find(y);
console.log('union parent ' + parent.toString())
}
}
}
var accountsMerge = function(accounts) {
if(!accounts || accounts.length===0) return [];
var dsu = DSU();
var emailToName = {};
var emailToID = {};
var id = 0;
for(var i=0; i<accounts.length; i++){
var account = accounts[i];
var name = account[0];
for(var j=1; j<account.length; j++){
var email = account[j];
emailToName[email] = name;
if(emailToID[email]===undefined) {
emailToID[email] = id++;
}
console.log('dsu-union '+ account[1] + ':' + emailToID[account[1]] + ' ' + email + ':'+ emailToID[email])
dsu.union(emailToID[account[1]], emailToID[email])
}
}
console.log(emailToID);
console.log(emailToName);
var ans = {};
Object.keys(emailToID).forEach(email => {
var index = dsu.find(emailToID[email]);
console.log('email - index: '+ email + ' - ' + index);
if(!ans[index]){
ans[index] = [email]
}else{
ans[index].push(email);
}
console.log('ans', ans);
});
Object.values(ans).forEach(list => {
list.sort();
list.unshift(emailToName[list[0]]);
});
return Object.values(ans);
};
var accounts = [
['hu', 'a', 'b', 'c'],
['hu', 'd', 'c', 'f'],
['he', 'e','k'],
['Le', 'm']
]
console.log(accountsMerge(accounts));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment