javascript - 数组中的差/和,以检查生成的两个数字是否导致另一个数组
问题描述
为了清楚起见,这就是我的意思。我想在将生成特定数字的数组(已排序)中查找最小的两个数字。步骤如下:
- 循环遍历数组,每次设置一个当前值,
将扣除其他数字。- 继续这样做,直到找到与问题匹配的数字并返回它们。
Example. I need two numbers that when subtracted from the array will give a result of 2.
let givenArray = [1, 4, 8, 10];
The subtraction should go thus: 4 - 1 = 3(doesn't match); //continue
8 - 4 = 1(doesn't match);// continue
8 - 1 = 7(doesn't match); //continue
10 - 8 = 2(match found); //stop and return 8, 10.
注意:这个相同的数组可能包含 6 和 8 或 8 和 10,它们都将产生 2,但应该返回 6 和 8。生成数组的方式并不重要。
PS:我昨天最终解决了它,但我不介意关于如何去做的其他想法。
解决方案
此解决方案利用哈希表并使用单循环方法从数组中获取两个值以平衡两个值。
首先,取两个值的绝对增量,
arrayA
并将其用于从更大的数组中取出值。
arrayB
然后通过检查所需值是否存在以及总和是否小于先前找到的集合来减少更大的数组。
delta
检查的参数是根据和的绝对增量、v
数组的实际值或取和的delta
和来构建的v
。最后一点,为了使这一切正常工作,实际值
v
包含在哈希表中,以供以后查找。结果要么是两个值的数组,它们平衡其他两个值,要么是
undefined
,如果没有找到值。
var arrayA = [3, 5],
arrayB = [2, 9, 5, 4],
delta = Math.abs(arrayA[0] - arrayA[1]),
values = {},
result = arrayB.reduce((r, v) => {
function check(w) {
if (!values[w] || r && r[0] + r[1] < v + w) return;
r = [w, v];
}
check(Math.abs(delta - v));
check(delta + v);
values[v] = true;
return r;
}, undefined);
console.log(result);
推荐阅读
- widget - 如何在标题中设置自定义小部件的样式
- git - git commit 和分支的问题
- javascript - 如何在不更改 Mac 上的系统语言的情况下使用 applescript 从剪贴板输入俄语文本?
- google-apps-script - 使用 Apps 脚本将自定义公式添加到 Google 表格
- node.js - 如何从 node-pty 获取文件描述符?
- django-rest-framework - Django REST Framework ViewSet 方法期望什么返回类型?
- bluetooth - 如何“预配对”蓝牙?
- c++ - 已删除文件夹的 FindFirstChangeNotification
- pyspark - 如何根据每日指标计算一系列状态?
- r - 使用glue_sql() 并避免粘贴在动态SELECT 语句中的方法?