Javascript 返回数组中的第一个重复数字

Javascript 返回数组中的第一个重复数字,javascript,arrays,algorithm,array-algorithms,Javascript,Arrays,Algorithm,Array Algorithms,我试图解决一个简单的挑战,我写了一个函数,返回数组中的第一个重复数 这就是我所尝试的: function duplicateNumber(arr) { for (var i = 0; i < arr.length; i++) { for (var j = arr.length; j >= 0; j--) { if (arr[i] === arr[j]) { var dup_num = arr[i]

我试图解决一个简单的挑战,我写了一个函数,返回数组中的第一个重复数

这就是我所尝试的:

function duplicateNumber(arr) {
    for (var i = 0; i < arr.length; i++) {
        for (var j = arr.length; j >= 0; j--) {
            if (arr[i] === arr[j]) {
                var dup_num = arr[i]
            }
        }
    }
    return dup_num
}
函数重复编号(arr){
对于(变量i=0;i=0;j--){
如果(arr[i]==arr[j]){
var dup_num=arr[i]
}
}
}
返回dup_num
}
它似乎不起作用。我做错了什么

刚刚意识到我也在从头到尾循环

在数组中=
[3,5,6,8,5,3]


重复的数字应该是
5
,因为它在3之前重复。

您的内部循环向下遍历到
0
。相反,它应该只转到
i+1
,这样它就不会在外循环中遇到当前字符,从而使它认为找到了重复的字符

此外,您的内部循环应该从
arr.length-1
开始,以确保正确无误,从而不会测试越界索引

代码已更新,以反映问题中的更改

函数重复编号(arr){
var idx=阵列长度;
外部:
对于(变量i=0;i=i+1;j--){
如果(arr[i]==arr[j]){
idx=j
继续向外
}
}
}
返回arr[idx]
}

log(duplicateNumber([3,5,6,8,5,3])您可以迭代直到元素结束,并从i+1检查到结束

此函数仅返回第一个副本

具有一个循环和一个哈希表的快速版本

函数重复编号(数组){
var hash=Object.create(null),
i、 l,价值;
对于(i=0,l=array.length;ilog(duplicateNumber([0,1,1,2,3,4,4,5]);//1
您不需要第二个循环,可以使用。此外,还可以减少代码行数并立即返回结果。例如:

函数重复编号(arr){
对于(变量i=0;ilog(duplicateNumber([3,5,6,8,5,3])在ES2015中,它与

let dupe = arr.find((k,i) => arr.lastIndexOf(k) !== i);
在这里,您只需检查索引,以查看在此索引之前是否存在具有相同值的索引,在这种情况下,它将是第一个找到的重复索引

函数重复编号(arr){
返回arr.find((k,i)=>arr.indexOf(k)!==i);
}
log(duplicateNumber([3,5,6,8,5,3])//5(不是3)
log(duplicateNumber([1,2,3,1,2,3])//1

log(duplicateNumber([1,2,3,4,4,2])//4(不是2)
作为一种替代方法,您可以使用对象来存储计数

函数重复编号(arr){
让count={};
对于(变量i=0;i1){
返回arr[i];
}
}
返回dup_num
}

log(duplicateNumber([0,1,1,2,3,4,4,5])。我建议这样做。这将在最坏情况下完成O(n)

函数重复编号(arr){
变量内存={};
对于(变量i=0;i
控制台日志(重复编号(arr))详细说明spanky所说的:在你的解决方案中,你总会在某一点上比较arr[i]和arr[j],而i等于j(因此等于它本身)。而且,由于在找到匹配项时不会停止迭代,因此我猜测您的函数将始终返回输入数组的最后一个元素。

发布输入数组。您是否尝试使用一个?是否允许修改或复制数组?抱歉,因此我误读了问题。在本例中:array=[3,5,6,8,5,3]返回值应该是5,因为它是数组中要复制的第一个值。如果执行
arr.sort()
,以便对值进行数字排序,则只需将数组中的每个项与其之前的项进行比较。如果它们匹配,return.fails for[0,1,1,2,3,4,4,5]@NickA,第一个提案只返回第一个。@NinaScholz谢谢,我在发表评论并删除评论后立即看到了它:)@NickA,也许您想对访问的项目使用不同的哈希表方法。然后,如果发现重复,您只需要一个循环并退出。这对于大多数大型阵列都很好,它们甚至无法达到10m n=100 time2:0.197ms n=1000000 time6:1430.918ms n=10000000 time7:15726.190ms不是因为没有理由,如果继续,它可能(如果有)返回以后的重复!嘿,这行得通,但我误解了这个问题。函数应返回未排序数组中的第一个重复值。所以在这样的数组中:[3,5,6,8,5,3]返回值应该是5,而不是3。@user7496931:是的,这就是它的作用。等等,为什么它要返回
5
?在未排序的数组中,第一个复制的成员是
3
。在数组中:[3,5,6,8,5,3]5在3之前复制。因此,返回值应该是5,而不是3。不是真的,看看我测试中超过1米的情况,但对于小型/正常大小的阵列,这是最干净的解决方案。@MichaelWarner-似乎速度上的差异不太明显,至少对我来说Chrome 60->我完全同意。我写了一个脚本来测试其中的一些答案,你的答案在3秒内就达到了100万,所以速度很快!然而
let dupe = arr.find((k,i) => arr.lastIndexOf(k) !== i);