【问题标题】:solving the 2-sum algorithm in javascript在javascript中解决2-sum算法
【发布时间】:2016-11-18 04:04:06
【问题描述】:

我正在尝试为 Javascript 中的 2-Sum 问题编写一个简单的解决方案。问题是:给定一个由 n 个整数组成的数组和一个目标总和,确定两个整数的哪些组合将与目标值相加。

我发现了一些使用哈希表的不同语言无关示例,并尝试在 javascript 中提出解决方案:

// Integer set:
arr = [1,4,2,3,0,5];
// Target sum:
arg = 7;

// Generate hash table
hashTable = {};
arr.forEach(function(value, index){ 
  hashTable[value] = index;
});

// hashTable = {
//   0: 4,
//   1: 0,
//   2: 2,
//   3: 3,
//   4: 1,
//   5: 5,
// }


for (var i = 0; i < arr.length; i++) {
  if (hashTable[arg - arr[i]]) {
      console.log([hashTable[arg - arr[i]], i])
  }
}

解决方案应该是 4,3 和 5,2,但我得到 3,1 5,2 1,3 和 2,5。我可以用笔和纸遍历 for 循环,看看我做错了什么,但我很确定我正在遵循我发现的与语言无关的示例(例如 herehere)。任何帮助,将不胜感激。

【问题讨论】:

  • a very concise solution这个问题相对容易翻译成JavaScript。
  • 循环 7-4 的第二遍是 3。您是否在与地球其他部分不同的数学平面上运行? hashTable[3] 仍然是 3。
  • @PHPglue 对不起,我真的不确定你在做什么。它是一个未排序的列表,值 3 恰好在索引 3 处。
  • 动态编程自下而上的方法应该是最好的

标签: javascript arrays algorithm


【解决方案1】:

在这里,您输出加法的索引,而您需要它的

 console.log([hashTable[arg - arr[i]], i])

这就是你得到这些值的原因:

  • 3, 1;这意味着索引 3 处的项目 + 索引 1 处的项目 = 7
  • 5, 2;这意味着索引 5 处的项目 + 索引 2 处的项目 = 7 等等。

尝试将输出中的i 更改为arr[i],并将hashTable[arg - arr[i]] 更改为arr[hashTable[arg - arr[i]]],它应该可以工作:

// Integer set:
var arr = [1,4,2,3,0,5];
// Target sum:
var arg = 7;

// Generate hash table
var hashTable = {};
arr.forEach(function(value, index){ 
  hashTable[value] = index;
});


for (var i = 0; i < arr.length; i++) {
  if (hashTable[arg - arr[i]]) {
      console.log([arr[hashTable[arg - arr[i]]], arr[i]]);
  }
}

请注意,您也会得到对称结果,因为 4 + 3 = 7 和 3 + 4 = 7 也是如此。
插入时检查可以优化解决方案:

var arr = [1, 4, 2, 3, 0, 5];
var arg = 7;

var hashtable = {};
arr.forEach(function(x) { 
  hashtable[x] = true;
  if (hashtable[arg - x]) 
    console.log([arg - x, x]); 
})

【讨论】:

  • 嗯。是的,我认为这是有道理的。您的更改在 i = 1 时修复了它,但当 i = 3 时输出为 [1,3](因为 hashTable 中的键 4 的值为 1)。
  • @SolomonBothwell 哦,是的,你也需要用 arr[] 包装第一个 summand,因为你也需要它的值。请参阅我的更新答案。
  • 哦,我明白了!非常感谢。您缩短的答案看起来也很酷。我现在正在研究它。
  • 我注意到两个版本都有一个错误。将目标值更改为 4,它将对相同的元素求和(在本例中为 2)。在 if 语句中添加 [arg - x] != x 可以解决这个问题。
  • 实际上是我的最后一条评论。该修复仅在数组中没有重复值的情况下才有效。尝试使用 arr = [1, 1, 1] 和 arg = 2 运行它
【解决方案2】:
function solution(arr, n){
var map = {};
for (var i = 0; i < arr.length; i++) {
    if (map[arr[i]] !== undefined) {
        console.log(arr[i], n - arr[i]);
    }
    map[n - arr[i]] = i;
  }
 }

【讨论】:

    【解决方案3】:

    试试这个:

    function sumPairs(inputArray, expectedSum){
      var a = inputArray.slice(), b = inputArray.slice(), l = a.length, p = [];
      for(var i=0,av; i<l; i++){
        av = a[i];
        for(var n=1,bv; n<l; n++){
          bv = b[n];
          if(av + bv === expectedSum){
            p.push([av, bv]);
          }
        }
      }
      return p;
    }
    console.log(sumPairs([1,4,2,3,0,5], 7));

    【讨论】:

      【解决方案4】:

      以下函数适用于多种情况。

         const twoSum = (numArr, target) => { 
              let numObject = {};
              numArr.forEach((value, index) => numObject[value] = index);
              for (let i = 0; i < numArr.length; i++) {
                  let diff = target - numArr[i];
                  if (numObject.hasOwnProperty(diff) && numObject[diff] !== i) {
                      return [i, numObject[diff]];
                  }
              }
          }
      

      【讨论】:

        【解决方案5】:

        const arr = [1, 2, 3, 4,5,6];
        let target = 9;
        let indexs = [];
        function sumNew(arr, target) {
            for (let i = 0; i < arr.length; i++) {
                for (let j = i+1; j < arr.length; j++) {
                    if ( arr[i] + arr[j]==target) {
                       indexs.push(i,j);
                       return indexs;
                    }
        
                }
            }
        }
        let result = sumNew(arr,target);
        console.log(result);

        【讨论】:

        • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
        猜你喜欢
        • 2017-02-26
        • 2012-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-31
        • 2012-08-09
        • 2017-08-12
        • 2021-06-25
        相关资源
        最近更新 更多