我需要加快速度才能通过代码测试(javascript)
任务是获取一个数组并返回最早的副本,如果没有,则返回-1。我是这样写的:我需要加快速度才能通过代码测试(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
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不起作用。我如何更新频率而不知道之前测试的所有数字?我不需要一直添加到数组中吗?您可以使用零值预先初始化反频率数组,并在遍历数组时添加一个值。