javascript - 我需要加快速度以通过代码战斗测试(javascript)

标签 javascript arrays performance

任务是获取一个数组并返回最早的重复项,如果没有则返回 -1。我是这样写的:

function firstDuplicate(a) {
    let singles = [];

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

        if (singles.indexOf(a[i]) == -1) {
            singles.push(a[i]);
        }
        else {
            return a[i];
        }

    }

    return -1;
}

它通过了除隐藏速度测试之外的所有测试。有没有另一种方法可以在 JS 中更快地编写它?我看到一个使用集合而不是数组的 Java 解决方案,但我想坚持使用 JS。

最佳答案

您可以使用 Set在 JavaScript 中也可以实现这一点:

function firstDuplicate(array) {
  const set = new Set()

  for (const value of array) {
    if (set.has(value)) {
      return value
    }

    set.add(value)
  }

  return -1
}

console.log(firstDuplicate(['a', 1, 'b', 2, 'c', 1, 2, 3]))

您的解决方案存在问题,如 @Zabuza 所述, 是你使用的 indexOf()这会将您的算法的时间复杂度从 O(n) 更改为 O(n2),因为每个 indexOf() 都是 O(n)。

使用 Set 而不是 Array 利用散列,它通过使用 has() 改变您的查找时间对于从 O(n) 到 O(1) 的重复,从而使算法总体上恢复到 O(n) 复杂度。

关于javascript - 我需要加快速度以通过代码战斗测试(javascript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45106990/

相关文章:

javascript - 如何在数组中的所有 bool 值之间应用 OR?

javascript - D3 : finding graph y-coordinate with mouseover

java - 从多个列表中获取值的所有组合

javascript - 使用铆钉将数据绑定(bind)到选择元素的 onchange 的最佳方法

java - java 中 Stream 的类型安全原始类型

arrays - 如何将扩展仅应用于泛型的某些特化?

c - 指向数组的指针 - C 编程

java - 我该如何做 AsyncLayoutInflater onCreate

java - 对生产中的一段 Java 代码进行计时。

javascript - 查找和过滤都不起作用