尽可能使用重复值存储数组的子集

时间:2017-01-19 14:10:03

标签: javascript arrays ecmascript-6

我遇到了一个问题,我要处理一个给定的值并检查这个值是否大于我的值数组,如果是,则使用我的数组组合输出。我已经在这里问了一个类似的问题:Store values in an array after treat the values from another array

重要说明,我想尽可能重复这些子集。我的解决方案仅提供具有不同数字的子集的组合。

例如。

我的数组总是:

const ArrayPrimitive = [100,50,20,10];

例如输入中的给定值:

  • 参赛作品:30.00结果:[20.00,10.00]
  • 参赛作品:80.00结果:[50.00,20.00,10.00]
  • 条目:125.00结果:抛出NoteUnavailableException
  • 条目:-130.00结果:抛出InvalidArgumentException
  • 条目:NULL结果:[空集]
  • 条目:200预期结果:[100.00,100.00] *这里是我被困的地方,我想要组合相同的子集值(我的阵列
    原始的)尽可能使用较小的数字。

    在这种情况下,我的子集中需要2个值为100,当我测试它时,它们的函数会抛出错误。

       const ArrayPrimitive = [100, 50, 20, 10]; // Assuming presorted     array(descending)
    
    function findChange(m) {
      return ArrayPrimitive.reduce((mm, c) => {
        if (mm.rest >= c) {
          mm.change.push(c);
          mm.rest -= c
        }
        return mm
      }, {
        change: [],
        rest: m
      });
    }
    
    function findChangeOld(m) {
      var retval = {
          change: [],
          rest: m
        },
        i = ArrayPrimitive.length;
    
      for (var x = 0; x < i; x++) {
        if (retval.rest >= ArrayPrimitive[x]) {
          retval.change.push(ArrayPrimitive[x])
          retval.rest -= ArrayPrimitive[x];
        }
      }
      return retval;
    }
    
    function calcChange(v) {
      var c = findChangeOld(v);
    
      if (v < 0 || isNaN(v)) {
        console.log('${v}: throw InvalidArgumentException');
        return;
      }
    
      if (c.rest > 0)
        console.log('${v}: throw NoteUnavailableException');
      else
        console.log('${v}: ${c.change}');
    }
    
    calcChange(30);
    calcChange(80);
    calcChange(105);
    calcChange(125);
    calcChange(-130);
    calcChange(null);
    

我希望我能说清楚。

1 个答案:

答案 0 :(得分:1)

当你向它提交“270”时,你得到一个数组[100,100,50,20]。

我将把例外和边缘情况留给你设置守卫。但这似乎可以满足你所有直截了当的情况。

        let arr = [100,50,20,10];

        let factors = [];
        let total = 270;

        arr.forEach ( d => {
            while ( total >= d ) {
                factors.push ( d );
                total -= d;
            }
        } );

        // [100, 100, 50, 20]
        console.log ( factors );