Javascript中的两个Leetcode总和-代码看起来正确,但是Leetcode说错了

时间:2019-07-15 23:22:17

标签: javascript

我正在研究'Two Sum' problem in Leetcode

我确定这段代码是正确的,我已经在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);

我得到的错误如下:

Input:
[3,2,4]
6
Output:
[0,1,1,2]
Expected:
[1,2]

为什么期望[1, 2]?当然,在这种情况下应该期望[0, 1],然后为什么我的代码两次添加到arr数组中?对我来说似乎是个虫子...

注意:我在Leetcode上看到很多有关此问题的帖子,但是都没有解决我在Javascript中遇到的特定问题。

3 个答案:

答案 0 :(得分:4)

  

为什么期望[1,2]?

因为2 + 4 = 6

  

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

不,因为3 + 2 = 5

  

然后为什么我的代码两次添加到arr数组中?

因为您在函数外部声明了数组。每次调用该函数都会重新使用它。将数组声明移到您的twoSum函数中,甚至更好:将return [i, j]而不是push移到空数组中。

答案 1 :(得分:1)

这是您可以尝试的另一种解决方案...

-AconcurrentSemantics

Click Here to RUN

答案 2 :(得分:1)

这是一个最佳解决方案

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
function twoSum(nums, target) {
  const numsObjs = {}; // create nums obj with value as key and index as value eg: [2,7,11,15] => {2: 0, 7: 1, 11: 2, 15: 3}

  for (let i = 0; i < nums.length; i++) {
    const currentValue = nums[i];

    if (target - currentValue in numsObjs) {
      return [i, numsObjs[target - currentValue]];
    }
    numsObjs[nums[i]] = i;
  }

  return [-1, -1];
}

console.log(twoSum([2, 7, 11, 15], 9))