我需要编写一个程序,当给定一个整数列表时,它会找到所有具有相同产品的2对整数。即2对是2对不同的整数,可以说[(a,b),(c,d)]其中a * b = c * d但a≠b≠c≠d。
整数范围应该是1到1024.我想要实现的是,当打开网页时,弹出窗口会提示用户输入整数数组,即{{1例如,输入[1,2,3,7,8,9,6]
输出应为[1,2,3,7,8,9,6]
,因为两者都评估为[(9,2),(3,6)]
。
到目前为止,我所做的编码非常基础,可以在下面看到。到目前为止我所做的是弹出框警告输入等,但似乎无法理解如何使程序检查对并给出总和。提前感谢这个帮助我更好地理解和学习javascript的社区!
我在下面做了一些研究,这个问题肯定与我的不同,但已经完成了。
代码:
18

答案 0 :(得分:1)
您可以迭代数组和数组的副本,以实际索引加一,以获取产品。将结果存储在以product为键的对象中。
然后获取对象的密钥(产品),过滤它以获得两个或更多产品的结果。
var array = [1, 2, 3, 7, 8, 9, 6],
result = {},
pairs;
array.forEach(function (a, i) {
array.slice(i + 1).forEach(function (b) {
(result[a * b] = (result[a * b] || [])).push([a, b]);
});
});
pairs = Object
.keys(result)
.filter(function (k) { return result[k].length >= 2; })
.map(function(k) { return result[k]; });
console.log(pairs);

答案 1 :(得分:0)
我们可以改变这个等式:
a * b = c * d | : b
a = c * d : b
所以实际上我们只需要获得三个数字(b,c,d)的所有不同组合,并检查结果(a)是否也在给定范围内:
while(true){
// shuffle
const [b, c, d] = items;
const a = c * d / b;
if(items.includes(a + ""))
return true;
}
return false;
现在你只需要对阵列进行洗牌以完成所有不同的组合。您可以找到算法here
答案 2 :(得分:0)
假设您有一个数组,例如[1,2,3,7,8,9,6]
和值18
,并且您需要找到乘以18
的对,那么请使用以下方法
将它们转换为地图 - O(n)
var inputArr = [1,2,3,7,8,9,6];
var map = inputArr.reduce( (acc, c) => {
acc[ c ] = true; //set any truthy value
return acc;
},{});
迭代inputArr
并查看map
- O(n)
var output = [];
var mulValue = 18;
inputArr.forEach( s => {
var remainder = mulValue/s;
if ( map[s] && map[remainder] )
{
output.push( [ s, remainder ] );
map[s] = false;
map[remainder] = false;
}
});
<强>演示强>
var inputArr = [1, 2, 3, 7, 8, 9, 6];
var map = inputArr.reduce((acc, c) => {
acc[c] = true; //set any truthy value
return acc;
}, {});
var output = [];
var mulValue = 18;
inputArr.forEach(s => {
var remainder = mulValue / s;
if (map[s] && map[remainder]) {
output.push([s, remainder]);
map[s] = false;
map[remainder] = false;
}
});
console.log(output);
&#13;
答案 3 :(得分:0)
您可以尝试这样的事情:
i
)作为第一个操作数(说op1
)。i+1
开始。这是为了减少迭代次数。hashMap
。hashMap
并删除任何长度小于2的值。
function sameProductValues(arr) {
var hashMap = {};
for (var i = 0; i < arr.length - 1; i++) {
for (var j = i + 1; j < arr.length; j++) {
var product = arr[i] * arr[j];
hashMap[product] = hashMap[product] || [];
hashMap[product].push([arr[i], arr[j]]);
}
}
for(var key in hashMap) {
if( hashMap[key].length < 2 ) {
delete hashMap[key];
}
}
console.log(hashMap)
}
sameProductValues([1, 2, 3, 7, 8, 9, 6])
&#13;