【问题标题】:Retuning a tuple of indices of two items in an array that add together to a target value重新调整数组中两个项目的索引元组,它们加在一起到目标值
【发布时间】:2022-01-05 19:31:51
【问题描述】:

我的任务是编写一个函数,它接受一个数字数组和一个目标数字

我必须在数组中找到两个数字相加形成目标,然后将两个数字的索引作为连音返回,就像这样 (index1, index2)。

我创建了一个嵌套的 for 循环来比较数组的每个元素与其他元素,然后运行 ​​if 语句以在达到目标值时返回索引。

但是,有些东西不起作用。我不确定如何以连音形式返回,或者我获取索引的代码可能是错误的。任何帮助或提示将不胜感激。谢谢

function twoSum(numbers, target) {
  for (let i = 0; i < numbers.length; i++) {
    for (let j = 0; j < numbers.length; j++) {
      if (numbers[i] + numbers[j] === target) {
        return [numbers.indexOf(i), numbers.indexOf(j)];
      }
    }
  }
}

【问题讨论】:

标签: javascript arrays algorithm for-loop tuples


【解决方案1】:

Array#indexOf() 返回传递给方法的值的位置。所以[1,2,3].indexOf(2) 会返回1。 [numbers.indexOf(i), numbers.indexOf(j)] 将为您提供计数器变量 i 和 j 在数组中的当前值的位置。如果值不在数组中,比如[1,2,3].indexOf(0),该方法将返回-1。

您要返回的索引只是 i 和 j。

function twoSum(numbers, target) {
  for (let i = 0; i < numbers.length; i++) {
    for (let j = 0; j < numbers.length; j++) {
      if (numbers[i] + numbers[j] === target) {
        return [i, j];
      }
    }
  }
}

console.log(twoSum([1,2,3,4],5)) // 1+4 = 5 => [0,3]
console.log(twoSum([1,2,3,4],9)) // undefined since there is no solution

【讨论】:

  • 另外,任务可能是找到两个不同的数(在不同的位置),即不给自己添加一个数。 if (i != j) 可以解决这个问题,或者更好地初始化 for (let j=i+1; …。
  • @Bergi:对。即使相同的数字可以使用两次,也没有必要尝试 j &lt; i 和 for (let j= i; ... 足够好的配对。
  • 我之前曾尝试返回 [i, j] 无济于事,但现在这对我来说更有意义。我可以确认将我的代码更改为 for (let j=i+1; ... 成功了!!
【解决方案2】:

当应用修复[i, j] 时,此算法将起作用。但它的效率非常低。特别是当没有解决方案时,它会尝试L²对。

现在,假设数组的排序越来越多。设置i=0,找到最小的j,从右到左扫描,这样n[i] + n[j] ≥ target。接下来,增加i 并将j 调整为最小的n[i] + n[j] ≥ target。以此类推,直到达到i 和j 交叉或完全相等。现在,对的数量只有L,这是一个相当大的节省。排序的成本与L.log(L)成正比。

所以一个策略是对数组进行排序,并像上面那样寻找一对匹配的值。要获取索引(在初始数组中),您可以保留一份副本并使用indexof。另一种选择是通过将其索引附加到每个元素来扩充数组,并在排序期间将它们一起移动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 2018-03-09
    • 2011-03-14
    • 2021-02-26
    • 2019-03-30
    • 1970-01-01
    • 2020-02-15
    相关资源
    最近更新 更多