【问题标题】:two for loops in js. cannot work on nested for loopjs中的两个for循环。无法在嵌套的 for 循环上工作
【发布时间】:2020-09-30 03:24:50
【问题描述】:

我正在解决以下问题,但不确定为什么我的第二个 for 循环会执行 console.log 任何操作。我目前得到一个结果 [],当我处理循环时,我有时会感到困惑,因为输出返回空结果。那么为什么我的第二个 for 循环没有执行,为什么我无法将结果推送到结果数组?

给定一个整数数组 nums 和一个整数目标,返回两个数字的索引,使它们相加为目标。您可以假设每个输入都只有一个解,并且您不能两次使用相同的元素。您可以按任意顺序返回答案。

示例 1: 输入:nums = [2,7,11,15],目标 = 9 输出:[0,1] 输出:因为 nums[0] + nums[1] == 9,所以我们返回 [0, 1]。

function a(nums, target) {

let result = [];

for (let i = 0; i < nums.length -1; i++){


    let firstNum = nums[i];

    console.log(i)
    
    for (let j = i + 1; j < nums.length -1; j++){

        console.log(j)
        let secondNum = nums[j];
        
        let sum = firstNum + secondNum;
        
        

        if (sum === target) {
            return result.push(i, j);
            }
        } 
    }
    return result; 
};

a([2,7,11,15], 9)

【问题讨论】:

  • 你得到两个console.logs ...一个用于i,一个用于j - 所以两个console.logs都发生一次 - return result.push(i, j); 意味着你在推送后返回新的结果长度(在本例中为 2) - 并退出函数(因为你返回) - 你想要做的就是删除那个返回,你会很好

标签: javascript for-loop nested-for-loop


【解决方案1】:

推送只返回数组的长度,尝试如下,

function a(nums, target) {

    let result = [];

    for (let i = 0; i < nums.length; i++){


        let firstNum = nums[i];

        console.log("i", i)

        for (let j = i + 1; j < nums.length; j++){

            console.log("j", j)
            let secondNum = nums[j];

            let sum = firstNum + secondNum;



            if (sum === target) {
                result.push(i, j);
                return result;
            }
        } 
    }
    return result; 
};

let result = a([2,7,11,15], 9);
console.log(result);

【讨论】:

  • 这仍然会提前停止该过程 - 我相信其目的是找到满足条件的所有组合......即循环内不需要返回
  • 但问题是,返回两个数字的索引,使它们加起来为目标
  • 在这种情况下,有一个解决方案......如果可以通过两种方式实现目标怎么办 - 这是我能想到推送到数组的唯一原因:p - 我不是在批评你的回答虽然 - 我以不同的方式阅读意图,仅此而已 - 我的意思是,你可以return [i, j],对:p
  • @zzzzou j 循环的迭代必须到 j &lt; nums.length 而不是 j &lt; nums.length -1
【解决方案2】:

您的代码实际上是正确的,只是您返回的是 result.push(i, j) 的结果,它返回数组的长度。

使用result.push(i, j);,然后使用return result;

而不仅仅是return result.push(i, j);

【讨论】:

    【解决方案3】:

    考虑将问题分解为更小的部分 -

    • t 生成唯一的数字组合
    • a 逐步通过生成器搜索第一个有效解决方案

    function* t(n, i = 0, p = [])
    { if (p.length >= 2)
        yield p
      else if (i >= n.length)
        return
      else
        ( yield* t(n, i + 1, [...p, n[i]])
        , yield* t(n, i + 1, p)
        )
    }
    
    function a(n, q)
    { for (const [a, b] of t(n)) // <- step thru t
        if (a + b == q)          // <- simple condition
          return [a, b]          // <- solution
    }
    
    const result =
      a([2,7,11,15], 9)
    
    console.log(result)

    输出 -

    [2, 7]
    

    如果无法得到答案,a 将返回 undefined

    【讨论】:

      猜你喜欢
      • 2018-07-13
      • 2021-09-15
      • 2021-04-13
      • 1970-01-01
      • 2015-01-28
      • 1970-01-01
      • 2020-04-18
      • 2020-03-04
      • 1970-01-01
      相关资源
      最近更新 更多