【问题标题】:Math.Abs() in Javascript - array unexpectedJavascript 中的 Math.Abs​​() - 数组意外
【发布时间】:2018-05-05 23:44:24
【问题描述】:

如果我在 Math.abs() 中传递数组,我无法理解为什么它返回 -3,为什么我的值从正变为负

let test1 = [2, 3, 3, 1, 5, 2]
let test2 = [2, 4, 3, 5, 1]
function firstDuplicate(a) {
  for (let i of a) {
    console.log(i);
    let posi = Math.abs(i) - 1;
    //console.log(posi);
  }

}
console.log(firstDuplicate(test1))
console.log(firstDuplicate(test2))

我不明白 Math.abs 是如何工作的,下面是真正的代码

function firstDuplicate(a) {
  for (let i of a) {
    let posi = Math.abs(i) - 1
    if (a[posi] < 0) return posi + 1
    a[posi] = a[posi] * -1
  }

  return -1
}

【问题讨论】:

  • 请添加结果和想要的结果。
  • 请注意你乘以 -1 a[posi] = a[posi] * -1

标签: javascript arrays typescript ecmascript-6


【解决方案1】:

Math.abs() 返回数字的绝对值。但是你将你的绝对值乘以负 1。这就是你得到负值的原因

a[posi] = a[posi] * -1

【讨论】:

  • 你能解释一下这段代码吗,因为我无法理解它是如何找到第一个重复项的
  • 需要作为另一个问题提出的问题
【解决方案2】:

你的代码有一些缺陷。

  for (let i of a) { 
    let posi = Math.abs(i) - 1
    if (a[posi] < 0) return posi + 1
    a[posi] = a[posi] * -1
  }

让我们一步一步地通过一个例子:

  1. (let i of a) 将为您提供数组中的每个值。例如在第一个循环 i=2
  2. let posi = Math.abs(i) - 1 会将数组中的数字转换为绝对整数并减去 1。现在 posi 将是 (2 - 1) = 1.
  3. a[posi] 现在将从索引 1 处的数组中获取值,即 3(在数组 test1 中)

  4. if (a[posi] 这将永远不会返回,除非您的数据中某处有负数或 0 ( Math.abs(0) - 1 === -1)。

  5. a[posi] = a[posi] * -1 现在更改数组中的值。在我们的示例中:a[1] = a[1] * -1。这将使数组处于以下状态:[2, -3, 3, 1, 5, 2]

我希望这可以帮助您理解自己的代码。也许在谷歌上寻找“如何在 aray 中找到第一个重复项”的解决方案,然后复制它。

【讨论】:

  • 感谢 Fabian,这段代码来自谷歌,运行良好,但我很困惑这段代码如何正常运行并给出预期结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-15
  • 1970-01-01
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多