如何找到在JavaScript中具有相同产品的所有2对整数?

时间:2018-03-19 10:17:44

标签: javascript html arrays popup syntax-error

我需要编写一个程序,当给定一个整数列表时,它会找到所有具有相同产品的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




4 个答案:

答案 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;
   }
});

<强>演示

&#13;
&#13;
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;
&#13;
&#13;

答案 3 :(得分:0)

您可以尝试这样的事情:

思想:

  • 遍历阵列以计算产品。使用此迭代器(i )作为第一个操作数(op1 )。
  • 现在再次循环遍历相同的数组,但范围将从i+1开始。这是为了减少迭代次数。
  • 现在创建一个包含产品和操作数的临时变量。
  • 在每次迭代中,在hashMap
  • 中为产品添加值
  • 现在遍历hashMap并删除任何长度小于2的值。

&#13;
&#13;
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;
&#13;
&#13;

相关问题