javascript - 算法产生的数组总和,小于一个限制
问题描述
我需要数组求和算法的帮助,结果数组值的总和永远不会大于限制,我在下面提供了输入 => 输出
我已经尝试过这样的事情,但它不适用于示例中的所有测试
input
.map((x, i) => input
.slice(0, i + 1)
.reduce((prev, cur) => prev + cur, 0) > limit ? Math.max((x - (input.reduce((prev, cur) => prev + cur, 0) - limit)), 0) : x)
示例测试:
限制 = 500
[0] => [0]
[300] => [300]
[600] => [500]
[0,1000] => [0, 500],
[600,300] => [500,0]
[500,0,0] => [500,0,0]
[400,200,0] => [400,100,0]
[0,200,300] => [0,200,300]
[0,600,300] => [0,500,0]
[0,0,600] => [0,0,500]
解决方案
您可以跟踪您还剩多少,并Math.min
在您的map
回调中使用:
let remaining = limit;
const result = array.map(value => {
value = Math.min(value, remaining);
remaining -= value;
return value;
});
现场示例:
function test(limit, array, expect) {
let remaining = limit;
const result = array.map(value => {
value = Math.min(value, remaining);
remaining -= value;
return value;
});
const good = result.every((value, index) => value === expect[index]);
console.log(array.join(","), result.join(","), good ? "OK" : "<== Error");
}
const limit = 500;
test(limit, [0], [0]);
test(limit, [300], [300]);
test(limit, [600], [500]);
test(limit, [0,1000], [0, 500]);
test(limit, [600,300], [500,0]);
test(limit, [500,0,0], [500,0,0]);
test(limit, [400,200,0], [400,100,0]);
test(limit, [0,200,300], [0,200,300]);
test(limit, [0,600,300], [0,500,0]);
test(limit, [0,0,600], [0,0,500]);
.as-console-wrapper {
max-height: 100% !important;
}
推荐阅读
- permissions - 授权权限和 UI 元素可见性——如何干净利落地实现?
- matlab - MATLAB中两个相关分布的卷积
- javascript - 为什么这个 React 代码不会改变状态,而 vanilla 代码会?
- openssl - 无法从 .pem 获取 .key
- botframework - Bot Framework v4 - 打开 2 个选项卡时出现 IndexOutOfRangeException
- javascript - 如何在画布上找到两个向量之间的角度?
- express - 使用 JWT 对单独的 API 微服务进行身份验证
- javascript - 使用 webpack 重新导出组件时不包含 Antdesign 样式
- javascript - Vue js 搜索数组
- sql - 如何比较两个不同表的列和匹配的列从表一中获取所有行?