2017-07-16 60 views
1

关于查找数组中第一个重复数字的问题,第二次出现的数据具有最小索引。理解查找重复数字并返回第二次出现的最低索引

如果我理解到目前为止,变量firstDuplicate是一个函数对象,它使用箭头符号来缩写'var firstDuplicate = function(a){}'等。这是我的问题开始的地方。

1)创建一个新的设置对象会自动填充使用函数传递的数组?如何知道set方法将数组传递给函数并进行一系列操作?

2)现在我明白在for循环中数组中的每个元素都被遍历并且当前索引是e,但这里是我开始在概念上开始丢失的内容。凡在以下几点:

if (r.has(e)) 

其中比较发生确切地说,这是检查看到重复的数字是什么这个数组中,并判断它们的比较有什么重复的第二出现的最低指数是?

const test1 = [0, 3, 4, 10, 2, 4, 2, 3] 
    firstDuplicate = a => { 
    r = new Set() 
      for (e of a) 
     if (r.has(e)) 
      return e 
     else 
     r.add(e) 
return -1 
} 

console.log(firstDuplicate(test1)); 

回答

0

创建一组新的对象自动地使用所述函数传递数组填充?如何知道set方法将数组传递给函数并进行一系列操作?

这里什么都不会自动发生。该Setelse状态填充,当你说r.add(e)

现在我在for循环数组中的每个项目被遍历当前指数为e ......

e理解是当前元素而不是当前索引。您正在使用for..of声明而不是for..in声明。用一个简单的片断

const a = [10, 5, 12]; 
 

 
console.log("for..in statement"); 
 
for (const i in a) { 
 
    // Here i is the index 
 
    console.log(i) 
 
}; 
 

 
console.log("for..of statement"); 
 
for (const i of a) { 
 
    // Here i is the element 
 
    console.log(i) 
 
};

二者之差......哪里是比较确切地发生,这是检查看到重复的数字是什么这个数组中,并比较决定了副本第二次出现的最低索引是什么?

比较发生在r.has(e)。所以代码检查是否已经遇到e(因此也添加了Set)并返回e。这是有效的,因为如果e已经遇到过一次,那么如果它在任何其他重复之前再次遇到,则它自动意味着e处于最小索引处。

这里是你的代码的注释版本,以使其更清晰

const test1 = [2, 3, 6, 10, 2, 3, 7, 9, 1] 

firstDuplicate = a => { 
    // Create an empty Set 
    r = new Set() 

    // Iterate over every element of a 
    for (e of a) { 
    // Check if e was already encountered 
    if (r.has(e)) { 
     // If e was already encountered, this is the first time a duplicate 
     // has been found. This is definitely a duplicate at the minimal index, 
     // as a for loop iterates elements in order of their indices 
     return e 
    } else { // e is encountered the firt time 
     // Populate the Set with e, to say that it has been encountered atleast 
     // once 
     r.add(e) 
    } 
    } 
    // The if condition above never passed. That means array a has all 
    // unique elements. Return -1, assuming the array a will never contain 
    // -1 as one of it's elements. 
    return -1 
} 

console.log(firstDuplicate(test1)); 
+0

感谢您玛斯抽出时间。我正在检查你的解决方案,可能会回来一个关于它的问题。谢谢。 –

+0

所以我只是改变了我原来的代码,我用我看到工作的数据用不同的值替换了数组。 [0,3,4,10,2,4,2,3]正如你所看到的,有三个重复的数字。这返回4.作为4的第二次出现的索引,小于2的第二次出现,以及3的第二次出现。我的问题 - 对于每个e的第一遍,因为r没有被初始化,所以r是空的,所以对于第一遍,控制将总是直接流向else子句,并填充r。是对的吗?不应该'如果(r.has(e))'总是返回true? –

+0

我不明白在代码中比较重复数字的索引以找出谁的第二次出现具有最小的索引。 –

相关问题