Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我需要加快速度才能通过代码测试(javascript)_Javascript_Arrays_Performance - Fatal编程技术网

我需要加快速度才能通过代码测试(javascript)

我需要加快速度才能通过代码测试(javascript),javascript,arrays,performance,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 { retu

任务是获取一个数组并返回最早的副本,如果没有,则返回-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;
}
函数firstDuplicate(a){
让单打=[];
for(设i=0;i

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

而不是使用单数,只需分配一个频率数组,并在循环原始数组时增加频率。 第一次频率为2时,您拥有最早的副本


按“1”增加数组第i个元素的频率肯定会更快,然后按一个数组,然后随时搜索它。

试试这个。在大型阵列中没有重复项的情况下,它应该可以提高速度

function firstDuplicate(a) {
    let singles = new Set(a);

    if(singles.size == a.length)
      return -1;

    let temp = [];


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

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

    }
}
函数firstDuplicate(a){
设singles=newset(a);
if(singles.size==a.length)
返回-1;
设temp=[];
for(设i=0;i
您也可以在JavaScript中使用来实现这一点:

函数firstDuplicate(数组){
常量集=新集()
for(数组的常量值){
if(set.has(value)){
返回值
}
set.add(值)
}
返回-1
}

log(firstDuplicate(['a',1',b',2',c',1,2,3])
使用散列(对象)来跟踪重复项,而不是另一个数组。使用js对象,而不是数组。因为这是一个测验,所以不给你答案:)首先你应该学习
array#indexOf
的工作原理。每次它都会从起始位置搜索到结束位置。搜索在
O(n)
中,速度相当慢。有多种加速方法,它们都包括使用不同的策略/数据结构。更好的数据结构是
HashSet
(包含在
O(1)
),
TreeSet
(包含在
O(logn)
)。当坚持使用数组时,更好的策略是搜索算法,如
BinarySearch
,或排序技术,如
QuickSort
。我相信JS中已经有一些可用的实现。您可以解释为什么这会更快。对于初学者来说,这并不清楚。
Array#indexOf
使用的技术是什么?与
Set#has
的区别在哪里。我想这也会有帮助。非常感谢你解释答案。我承认我现在有点不知所措,但我明白你所说的要点。我知道这与indexOf的速度慢有关,但我不知道你甚至可以在JS中使用Set()。直到现在我还没听说过。再次感谢你,我喜欢从新开始学习新事物!我不知道不使用sort()怎么做,在这种情况下sort不起作用。我如何更新频率而不知道之前测试的所有数字?我不需要一直添加到数组中吗?您可以使用零值预先初始化反频率数组,并在遍历数组时添加一个值。