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