Javascript代码中的二和Leetcode看起来是正确的,但Leetcode说它是错误的

Javascript代码中的二和Leetcode看起来是正确的,但Leetcode说它是错误的,javascript,Javascript,我正在做这项工作 我确信这段代码是正确的,我已经在Repl中测试过了,它看起来是正确的,但是Leetcode给了我一个错误 这是我的密码: var arr = []; var twoSum = function(nums, target) { for(var i = 0; i < nums.length; i++){ for(var j = i+1; j < nums.length; j++){ console.log(nums[i]

我正在做这项工作

我确信这段代码是正确的,我已经在Repl中测试过了,它看起来是正确的,但是Leetcode给了我一个错误

这是我的密码:

var arr = [];

var twoSum = function(nums, target) {
   for(var i = 0; i < nums.length; i++){
        for(var j = i+1; j < nums.length; j++){
            console.log(nums[i] + ', ' + nums[j]);
            var tot = nums[i] + nums[j];        
            if(tot === target){
                arr.push(i,j);
                console.log(arr);
                return arr;
            }     
         }         
   }
};

//var a = [2, 7, 11, 15];
//var b = 9;
var a = [2, 3, 4];
var b = 6;

twoSum(a, b);
为什么它期望[1,2]?当然,在这种情况下应该是[0,1],那么为什么我的代码要两次添加到arr数组中呢?在我看来,它像一只虫子

注意:我看到在Leetcode上有很多关于这个问题的帖子,但是没有一篇文章提到我在Javascript中遇到的具体问题

为什么它期望[1,2]

因为2+4=6

在这种情况下,它当然应该期望[0,1]

不,因为3+2=5

那么为什么我的代码要两次添加到arr数组


因为您在函数外部声明了数组。每次调用函数时都会重复使用它。将数组声明移到twoSum函数中,甚至更好:只需返回[i,j],而不是将其推入空数组。

这里是另一个可以尝试的解决方案

var twoSum = function(nums, target) {
let map = {};
for (let i = 0; i < nums.length; i++) {
  let compliment = target - nums[i];
  if (map[compliment]) {
    return [(map[compliment] - 1), i];
  } else {
    map[nums[i]] = i + 1;
    }
   }
 };

 twoSum([2, 3, 4],6);

这是一个最佳解决方案

/** *@param{number[]}nums *@param{number}目标 *@return{number[]} */ 函数twoSumnums,目标{ const numsObjs={};//创建nums obj,值作为键,索引作为值,例如:[2,7,11,15]=>{2:0,7:1,11:2,15:3} 对于let i=0;ilogtwoSum[2,7,11,15],9谢谢,将数组移动到函数中修复了它。我喜欢诵读困难症,出于某种原因,我的大脑决定我需要找到的是乘积而不是总和,并且用它做了一些奇怪的事情。赫伦夫。
var twoSum = function(nums, target) {
let map = {};
for (let i = 0; i < nums.length; i++) {
  let compliment = target - nums[i];
  if (map[compliment]) {
    return [(map[compliment] - 1), i];
  } else {
    map[nums[i]] = i + 1;
    }
   }
 };

 twoSum([2, 3, 4],6);