【问题标题】:Store subset of an array using repeated values as much as possible尽可能使用重复值存储数组的子集
【发布时间】:2017-01-19 14:10:02
【问题描述】:

我遇到了一个问题,我必须处理给定值并检查该值是否大于我的值数组,如果是,则使用我的数组组合输出。我已经在这里问过类似的问题: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);
    

我希望我说清楚了。

【问题讨论】:

  • 也许把if (mm.rest &gt;= c)改成while (mm.rest &gt;= c)
  • @Pointy 感谢您的帮助,但没有成功。
  • 可能有适合您的解决方案:如果您提交的数字大于数组总和(事实上,这一点可能会帮助您查看解决方案)然后进行检查。例如,您的数组总和为 190。因此,任何数字 > 190(或者更确切地说,任何数字 > arraysum + 最大数字),您将查看是否将该数组中的最大数字组合 N 次留下(模数)与剩余可以通过较小的数字来满足。如果没有,那么您知道您必须使用较小的数字。是的?如果它不仅仅是最大的数字,那么您将使用每个较小的数字递归 mod 结果。
  • 听起来像标准的change-making problem,有标准的解决方案。

标签: javascript arrays ecmascript-6


【解决方案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 );

【讨论】:

    猜你喜欢
    • 2012-10-18
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 2013-05-31
    • 2022-01-20
    • 2018-06-06
    • 2012-05-23
    相关资源
    最近更新 更多