萌新的我遇到了一道算法, 苦手求大佬 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
awesomelei
V2EX    程序员

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

  •  
  •   awesomelei 2019-02-19 15:16:11 +08:00 3740 次点击
    这是一个创建于 2432 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需要将借款与还款作配对, 借款与还款是是多对多关系, 通俗说明:借款与还款先后进行匹配, 多余部分匹配到对应的下一笔上,示例 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:[] }] 
    31 条回复    2019-02-19 23:22:24 +08:00
    awesomelei
        1
    awesomelei  
    OP
       2019-02-19 15:16:36 +08:00
    以上的 xxxxId 指的是数组的索引编号
    awesomelei
        2
    awesomelei  
    OP
       2019-02-19 15:19:12 +08:00
    这种匹配有什么好的算法吗? 劳烦大佬们给点关键词线索也行, 数据源 loan 跟 repay 是固定的, 不考虑动态问题
    yesterdaysun
        3
    yesterdaysun  
       2019-02-19 15:25:42 +08:00
    loan 的和是 10000, repay 的和是 9000, 是题有问题吗? 还是可能会出现不对等的情况?
    dark3212
        4
    dark3212  
       2019-02-19 15:27:37 +08:00
    两个数组都取第一个值,分别记录到借款总和变量、还款总和变量。
    哪个大就从另一个数组取下一个值,一直循环到取不出值为止。
    hinate
        5
    hinate  
       2019-02-19 15:32:40 +08:00
    @yesterdaysun 看题目和输出,是有不对等的。不对等的部分生成了一个新的 loanAmount
    shylockhg
        6
    shylockhg  
       2019-02-19 15:37:58 +08:00
    先把 load[0]赋值到 current_load ;
    然后 current_load = current_load - repay,大于零换下一个 repay,等于零环下一个 load,负数说明数据错误。
    shylockhg
        7
    shylockhg  
       2019-02-19 15:39:48 +08:00
    数组是时序排列?
    shylockhg
        8
    shylockhg  
       2019-02-19 15:40:37 +08:00   1
    话说你们借钱都不收利息么
    awesomelei
        9
    awesomelei  
    OP
       2019-02-19 15:49:55 +08:00
    @shylockhg 这里还得考虑到用户的还款可能不仅仅针对 1 笔的, 比如 5000, 4000, 用户先还了 8000, 再还 1000, 8000 对应的可能是两笔, 数组是时序排的,
    shylockhg
        10
    shylockhg  
       2019-02-19 15:51:17 +08:00
    @awesomelei 那我这个没问题啊
    shylockhg
        11
    shylockhg  
       2019-02-19 15:51:50 +08:00
    @awesomelei 哦看错了
    awesomelei
        12
    awesomelei  
    OP
       2019-02-19 15:52:50 +08:00
    @dark3212 好想法
    murmur
        13
    murmur  
       2019-02-19 15:56:48 +08:00
    @shylockhg 互联网金融本金都不还的
    reus
        14
    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
        15
    GeruzoniAnsasu  
       2019-02-19 16:01:26 +08:00
    awesomelei
        16
    awesomelei  
    OP
       2019-02-19 16:23:24 +08:00
    @GeruzoniAnsasu V 站都是实干派, 为你点赞
    abeholder
        17
    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
        18
    awesomelei  
    OP
       2019-02-19 16:29:59 +08:00
    @reus 这里最后, 把每一步的信息按 loanId 分组不是特别明白
    awesomelei
        19
    awesomelei  
    OP
       2019-02-19 16:34:46 +08:00
    @abeholder 老弟, 把 repay = [6000, 4000, 3000] 代入, 这段程序可能不符合题意了嗷
    abeholder
        20
    abeholder  
       2019-02-19 16:37:47 +08:00
    @awesomelei
    哪里不符合 , 还的比欠的还多不应该是负数 ?
    abeholder
        21
    abeholder  
       2019-02-19 16:39:00 +08:00
    @awesomelei 你这个用例最后结果 - 3000 难道不对吗?
    awesomelei
        22
    awesomelei  
    OP
       2019-02-19 16:41:11 +08:00
    以这个为例子
    ```
    const loan = [5000, 4000, 1000];
    const repay = [6000];
    ```
    看下输出, 有些 loan 对应的可能还是 NaN 的类型
    @abeholder
    awesomelei
        23
    awesomelei  
    OP
       2019-02-19 16:41:58 +08:00
    @abeholder 当我举措例子, 以 const repay = [6000]为准= =抱歉
    awesomelei
        24
    awesomelei  
    OP
       2019-02-19 16:45:42 +08:00
    @abeholder 不合题意的在于 第一笔 repay 如果大于第一笔 loan, 可能出现将负数 loan 添加进去, 这边还有个隐藏要求是,不显示负数, 到最后一轮循环匹配不上的数目就结束= =
    abeholder
        25
    abeholder  
       2019-02-19 16:47:59 +08:00
    @awesomelei 所以 [6000] 这个用例的输出结果是?
    awesomelei
        26
    awesomelei  
    OP
       2019-02-19 16:52:54 +08:00
    @abeholder
    relation = [{
    loanId: 0,
    loanAmount: 5000,
    repay: [{
    repayId: 0,
    repayAmount:5000
    }
    }, {
    loanId:1,
    loanAmount:4000,
    repay: [{
    repayId:0,
    repayAmount: 1000
    }]
    }, {
    loanID:2,
    loanAmount:1000,
    repay:[]
    }]
    awesomelei
        27
    awesomelei  
    OP
       2019-02-19 16:56:05 +08:00
    @abeholder
    ```
    relation = [{
    loanId: 0,
    loanAmount: 5000,
    repay: [{
    repayId: 0,
    repayAmount:5000
    }]
    }, {
    loanId:1,
    loanAmount:4000,
    repay: [{
    repayId:0,
    repayAmount: 1000
    }]
    }, {
    loanId:2,
    loanAmount:1000,
    repay:[]
    }]
    ```
    abeholder
        28
    abeholder  
       2019-02-19 16:58:50 +08:00
    @awesomelei 好麻烦啊,不会 = =
    awesomelei
        29
    awesomelei  
    OP
       2019-02-19 17:08:21 +08:00
    @dark3212 对了, 但这样好像没有差额的概念了, 这里还可能需要把一笔还款拆分成多笔, 加入到 loan 中,需要具体的金额
    dark3212
        30
    dark3212  
       2019-02-19 17:42:28 +08:00
    变换下思路就行啊,
    思路给你了,多 debug 啥都就有了。
    假设 借款总额变量是 loanSum,还款总额变量是 repaySum。

    当前循环借款更大的情况
    nextRepay = 取下一个还款
    if(loanSum>repaySum+nextRepay)
    差额 = nextRepay
    else
    差额= loanSum - repaySum
    repaySum += nextRepay
    继续循环

    还款更大的情况
    nextLoan = 取下一个借款
    if(loanSum + nextLoan >repaySum)
    差额 =repaySum - loanSum
    else
    差额= nextLoan
    loanSum += nextLoan
    继续循环
    injy
        31
    injy  
       2019-02-19 23:22:24 +08:00 via Android
    是不是可以直接按照题意:
    tmpNum=repay1

    if(loan1>tmpNum)
    arr1[]=tmpNum
    tmpNum+=repay2
    else
    arr1=loan1-(tmpNum-repay1)
    tmpNum-=loan1

    return arr1
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2644 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 01:16 PVG 09:16 LAX 18:16 JFK 21:16
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86