【发布时间】:2017-07-14 15:45:26
【问题描述】:
任务是获取一个数组并返回最早的副本,如果没有则返回 -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。
【问题讨论】:
-
使用散列(一个对象)而不是另一个数组来跟踪重复项。
-
使用 js 对象,而不是数组。因为这是一个测验,所以不给你答案:)
-
首先您应该了解
array#indexOf的工作原理。每次都会从起始位置搜索到结束位置。搜索在O(n)中,速度很慢。有多种方法可以加快速度,它们都包括使用不同的策略/数据结构。更好的数据结构是HashSet(包含在O(1))、TreeSet(包含在O(log n))。坚持使用数组时更好的策略是搜索算法,如BinarySearch或排序技术,如QuickSort。我确信 JS 中已经有一些实现。
标签: javascript arrays performance