javascript中二和算法的求解

javascript中二和算法的求解,javascript,arrays,algorithm,Javascript,Arrays,Algorithm,我正试图用Javascript编写一个简单的2和问题解决方案。问题是:给定一个由n个整数组成的数组和一个目标和,确定两个整数的哪些组合将和为目标值 我发现了一些使用哈希表的不同语言不可知示例,并尝试用javascript提出解决方案: // Integer set: arr = [1,4,2,3,0,5]; // Target sum: arg = 7; // Generate hash table hashTable = {}; arr.forEach(function(value, ind

我正试图用Javascript编写一个简单的2和问题解决方案。问题是:给定一个由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])
  }
}
//整数集:
arr=[1,4,2,3,0,5];
//目标金额:
arg=7;
//生成哈希表
哈希表={};
arr.forEach(函数(值,索引){
哈希表[值]=索引;
});
//哈希表={
//   0: 4,
//   1: 0,
//   2: 2,
//   3: 3,
//   4: 1,
//   5: 5,
// }
对于(变量i=0;i

解应该是4,3和5,2,但我得到的是3,1,5,2,1,3和2,5。我可以用笔和纸在for循环中穿行,看到我做错了什么,但我很确定我在遵循我发现的朗格不可知论的例子(例如和)。任何帮助都将不胜感激

在这里,您可以输出求和的索引,同时需要其

 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]]]
,它应该可以工作:

//整数集:
var-arr=[1,4,2,3,0,5];
//目标金额:
var-arg=7;
//生成哈希表
var hashTable={};
arr.forEach(函数(值,索引){
哈希表[值]=索引;
});
对于(变量i=0;i
试试这个:

函数sumPairs(inputArray,expectedSum){
变量a=inputArray.slice(),b=inputArray.slice(),l=a.length,p=[];
对于(var i=0,av;i
函数解(arr,n){
var-map={};
对于(变量i=0;i
以下函数适用于多种情况

   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]];
            }
        }
    }
consttwosum=(numar,target)=>{
设numbject={};
numar.forEach((值,索引)=>numbject[value]=index);
for(设i=0;i
这个问题有一个相对容易翻译成JavaScript的问题。在循环的第二次循环中,7-4是3。你是在一个独立的数学平面上操作的吗?
哈希表[3]
仍然是3。@PHPglue抱歉,我真的不确定您得到的是什么。这是一个未排序的列表,值3恰好位于索引3。动态编程自下而上的方法应该是最好的。是的,我认为这是有意义的。您的更改在I=1时修复了它,但当I=3时,输出是[1,3](因为哈希表中的键4的值为1)。@SolomonBothwell噢,是的,您需要用
arr[]包装第一个summand
也是,因为你也需要它的值。请看我的更新答案。哦,我明白了!非常感谢。你的缩短答案看起来也很酷。我正在研究它。我注意到两个版本中都有一个错误。将目标值更改为4,它将对相同的元素求和(本例中为2)。添加[arg-x]!=x到if语句解决了这个问题。实际上,请划掉我的最后一条注释。该修复仅在数组中没有重复值时有效。请尝试使用arr=[1,1,1]和arg=2运行它
   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]];
            }
        }
    }