萌新的我遇到了一道算法, 苦手求大佬

2019-02-19 15:16:11 +08:00
 awesomelei

需要将借款与还款作配对, 借款与还款是是多对多关系, 通俗说明:借款与还款先后进行匹配, 多余部分匹配到对应的下一笔上,示例 loan = [5000, 4000, 1000]; repay = [2000, 4000,3000]; 则输出

relation = [{
    loanId: 0,
    loanAmount: 5000,
    repay: [{
    	repayId: 0,
        repayAmount:2000
    }, {
    	repayId: 1,
        repayAmount:3000
    }]
}, {
    loanId:1,
    loanAmount:4000,
    repay: [{
    	repayId:1,
        repayAmount: 1000
    }, {
    	repayId:2,
        repayAmount:3000
    }]
}, {
    loanId:2,
    loanAmount:1000,
    repay:[]
}]
3392 次点击
所在节点    程序员
31 条回复
awesomelei
2019-02-19 15:16:36 +08:00
以上的 xxxxId 指的是数组的索引编号
awesomelei
2019-02-19 15:19:12 +08:00
这种匹配有什么好的算法吗? 劳烦大佬们给点关键词线索也行, 数据源 loan 跟 repay 是固定的, 不考虑动态问题
yesterdaysun
2019-02-19 15:25:42 +08:00
loan 的和是 10000, repay 的和是 9000, 是题有问题吗? 还是可能会出现不对等的情况?
dark3212
2019-02-19 15:27:37 +08:00
两个数组都取第一个值,分别记录到借款总和变量、还款总和变量。
哪个大就从另一个数组取下一个值,一直循环到取不出值为止。
hinate
2019-02-19 15:32:40 +08:00
@yesterdaysun 看题目和输出,是有不对等的。不对等的部分生成了一个新的 loanAmount
shylockhg
2019-02-19 15:37:58 +08:00
先把 load[0]赋值到 current_load ;
然后 current_load = current_load - repay,大于零换下一个 repay,等于零环下一个 load,负数说明数据错误。
shylockhg
2019-02-19 15:39:48 +08:00
数组是时序排列?
shylockhg
2019-02-19 15:40:37 +08:00
话说你们借钱都不收利息么
awesomelei
2019-02-19 15:49:55 +08:00
@shylockhg 这里还得考虑到用户的还款可能不仅仅针对 1 笔的, 比如 5000, 4000, 用户先还了 8000, 再还 1000, 8000 对应的可能是两笔, 数组是时序排的,
shylockhg
2019-02-19 15:51:17 +08:00
@awesomelei 那我这个没问题啊
shylockhg
2019-02-19 15:51:50 +08:00
@awesomelei 哦看错了
awesomelei
2019-02-19 15:52:50 +08:00
@dark3212 好想法
murmur
2019-02-19 15:56:48 +08:00
@shylockhg 互联网金融本金都不还的
reus
2019-02-19 16:01:18 +08:00
两个数组,比较第一个元素的大小,把小的移除,把大的减去小的
重复这个步骤,直到其中一个数组为空
[5 4 1] [2 4 3]
移除 2 => [3 4 1] [4 3]
移除 3 => [4 1] [1 3]
移除 1 => [4 1] [3]
移除 3 => [1 1] []
把每一步的信息按 loanID 分组即可。
GeruzoniAnsasu
2019-02-19 16:01:26 +08:00
awesomelei
2019-02-19 16:23:24 +08:00
@GeruzoniAnsasu V 站都是实干派, 为你点赞
abeholder
2019-02-19 16:28:17 +08:00
直接贴个 js 代码

const loan = [5000, 4000, 1000];
const repay = [2000, 4000, 3000];

let relation = [];

let loanCount = 0;
let repayCount = 0;
let index = 0;
for (;index < loan.length; index++) {
let json = {};
json.loanId = index;
json.loanAmount = loan[index];
json.repay = [];
json.repay.push({"repayId" : index, "repayAmount" : repay[index] - (loanCount - repayCount)});
loanCount += loan[index];
repayCount += repay[index];
json.repay.push({"repayId" : index + 1, "repayAmount" : loanCount - repayCount})
relation.push(json);
}
console.log(relation)
awesomelei
2019-02-19 16:29:59 +08:00
@reus 这里最后, 把每一步的信息按 loanId 分组不是特别明白
awesomelei
2019-02-19 16:34:46 +08:00
@abeholder 老弟, 把 repay = [6000, 4000, 3000] 代入, 这段程序可能不符合题意了嗷
abeholder
2019-02-19 16:37:47 +08:00
@awesomelei
哪里不符合 , 还的比欠的还多不应该是负数 ?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/536565

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX