javascript - 使用javascript从数组中获取值等于特定总和的元素对
问题描述
给定一个数组 [2, 7, 5, 3, 9] 我试图从数组中找到总和等于 12 的值对,下面是我编写的代码
let arr1 = [2, 7, 5, 3, 9]
let addSum = 12;
for (let i = 0; i < arr1.length; i++) {
let diff = addSum - arr1[i];
if (arr1.includes(diff)) {
console.log('Arr pair has value' + diff + ': ' + arr1[i]);
}
}
但我面临的问题是控制台中的值重复,如下所示 -
Arr pair has value5: 7
Arr pair has value7: 5
Arr pair has value9: 3
Arr pair has value3: 9
如果我已经拥有(5,7)
它不应该重复,因为(7,5)
我该怎么做?
解决方案
最简单的解决方案是在找到时从数组中删除其他项索引:
let arr = [2, 7, 5, 3, 9]
let addSum = 12;
for (let i = 0; i < arr.length; i++){
let diff = addSum - arr[i];
const index = arr.indexOf(diff);
if (index !== -1) {
console.log('Arr pair has value' + arr[index] + ': '+arr[i]);
arr.splice(index, 1);
i--; // to avoid skipping the next one from the array indicies shifting down
}
}
另一个具有更好时间复杂度(O(n)
而不是O(n ^ 2)
)的解决方案是将项目放入 Set 中,假设重复不是问题:
const set = new Set([2, 7, 5, 3, 9]);
let addSum = 12;
for (const item of set) {
const diff = addSum - item;
if (set.has(diff)) {
console.log('Arr pair has value' + item + ': '+diff);
set.delete(diff);
}
}
如果您需要考虑重复的可能性,请改用 Map(或对象),其中值是在原始数组中找到键(数字)的次数。当找到与 diff 匹配的键时,仅当值大于 0 时记录,并减少该值。
推荐阅读
- html - Django + Jinja/css vs Django + React
- javascript - 带有特殊字符的 JavaScript 正则表达式
- mysql - 用于使用现有外键关系更新第二个外键列中的数据的 mysql 脚本
- xml - 我可以在不输入 TODO 的情况下在 XML 文件中制作彩色线条吗?
- django - 添加查找表达式后未显示 Django-filter 字段 - django-filter lib
- c++ - 制作两个重量至少为 k 的袋子所需的最少元素数?
- python - 月/年字符串的 dateutil 解析器
- arrays - 使用递归检查数组是否升序
- python - 返回内存位置而不是字符串
- html - 为什么滚动行为在我的手机上不起作用?