splitwise-js-map
Version:
Minimize Cash Flow among a given set of friends who have borrowed money from each other. Given a number of friends who have to give or take some amount of money from one another. Design an algorithm by which the total cash flow among all the friends is mi
73 lines (63 loc) • 2.58 kB
JavaScript
function simplifyDebts(transactions){
var splits = new Array()
var transaction_map = new Map();
for(let i in transactions){
if(!transaction_map.has(transactions[i].paidBy)){
transaction_map.set(transactions[i].paidBy, 0) // net transactions map
}
for(let tr in transactions[i].paidFor){
if(!transaction_map.has(tr)){
transaction_map.set(tr, 0) // net transactions map
}
transaction_map.set(transactions[i].paidBy, transaction_map.get(transactions[i].paidBy) + transactions[i].paidFor[tr])
transaction_map.set(tr, transaction_map.get(tr) - transactions[i].paidFor[tr])
}
}
function settleSimilarFigures(){
let vis = new Map();
for(let tr1 of transaction_map.keys()){
vis.set(tr1, 1);
for(let tr2 of transaction_map.keys()){
if(!vis.has(tr2) && tr1 != tr2){
if(transaction_map.get(tr2) == -transaction_map.get(tr1)){
if(transaction_map.get(tr2) > transaction_map.get(tr1)){
splits.push([tr1, tr2, transaction_map.get(tr2)])
}else{
splits.push([tr2, tr1, transaction_map.get(tr1)])
}
transaction_map.set(tr2, 0)
transaction_map.set(tr1, 0)
}
}
}
}
}
function getMaxMinCredit(){
let max_ob, min_ob, max = Number.MIN_VALUE, min = Number.MAX_VALUE
for(let tr of transaction_map.keys()){
if(transaction_map.get(tr) < min){
min = transaction_map.get(tr)
min_ob = tr
}
if(transaction_map.get(tr) > max){
max = transaction_map.get(tr)
max_ob = tr
}
}
return [min_ob, max_ob];
}
function helper(){
let minMax = getMaxMinCredit();
if(minMax[0] == undefined || minMax[1] == undefined) return;
let min_value = Math.min(-transaction_map.get(minMax[0]), transaction_map.get(minMax[1]));
transaction_map.set(minMax[0], transaction_map.get(minMax[0]) + min_value);
transaction_map.set(minMax[1], transaction_map.get(minMax[1]) - min_value);
let res = [minMax[0], minMax[1], min_value];
splits.push(res);
helper();
}
settleSimilarFigures();
helper();
return splits;
}
module.exports = simplifyDebts;