首页 > 解决方案 > JS for循环在for循环中,我猜范围有问题

问题描述

输入是一个数组 ints [11, 2, 7, 8, 4, 6] 和整数 s 10。功能是输出一个数组,其中包含一对来自 int 的两个数字,它们首先形成 10 的和。所以在这里输出应该是[2, 8],因为2 + 8 = 10。为什么输出空数组?arrResults 是在嵌套的 for 循环中更新的,那么为什么它在最后的 return 语句之后没有显示出来呢?

function sumPairs(ints, s) {
  let arrResults = [];
  let sumOfTwo;
  for (i = 0; i < ints.length; i++) {
    for (j = 0; j < ints.length; j++) {
      sumOfTwo = ints[i] + ints[j];
      if (sumOfTwo === s) {
        arrResults.push(ints[i]);
        arrResults.push(ints[j]);
        break;
      }
    }
    if (arrResults !== []) {
      break;
    }
  }
  return arrResults;
}

console.log(sumPairs([11, 2, 7, 8, 4, 6], 10));

标签: javascriptfor-loopscopenested-loops

解决方案


除了一个数组与另一个数组的错误比较(没有相同的对象引用)

a = []
b = []

a === b // false

// other example

a = []
b = a

a === b // true

检查长度,

a = []
a.length // 0

并使用 n² 的近似二次时间复杂度,即使使用循环

i = 0; i < array.length - 1
j = i + 1; j < array.length

大于 n² 的一半,但仍然是二次方的,

您可以使用一个已看到值的对象进行单个循环。

这种方法会找到数组的第一对和某个总和。

function sumPairs(ints, s) {
    const needed = {};

    for (const value of ints) {
        if (needed[value]) return [s - value, value];
        needed[s - value] = true;
    }
}

console.log(sumPairs([11, 2, 7, 8, 4, 6], 10));


推荐阅读