在前n个词的JavaScript序列中查找重复元素

假设我们给了一个数字数组,其中包含前n个自然数,但是一个元素出现在数组中两次,因此元素总数为n + 1。我们的工作是编写一个函数,该函数接受数组并返回线性时间中出现两次的数字。

方法1:使用Array.prototype.reduce()

这是一个比较棘手的方法,但是在编写的代码方面压缩程度最高。首先,让我们看看它的代码-

const arr = [1,4,8,5,6,7,9,2,3,7];
const duplicate = a => a.reduce((acc, val, ind) => val+acc-
(ind+1))+a.length-1;
console.log(duplicate(arr));

在这里,我们使用了reduce函数,它的回调函数,该函数对数组的每个元素都操作一次,在本例中,它采用了三个参数,

  • acc→累加器,前一遍返回的值,以及

  • val→当前元素值,

  • ind→当前元素的索引

现在,让我们将代码应用于此数组-

[ 2, 3, 1, 2]

由于此数组的长度为4,因此回调函数应该总共进行4次传递,但是由于我们尚未向reduce()函数提供initialValue参数,因此迭代将从索引1开始,并且累加器将初始分配有第0个值。索引,因此总共会有3次通过。

首过

acc = 2, val = 3, ind = 1
return value = 2+3 - (1+1) = 3

第二关

acc = 3, val = 1, ind = 2
return value = 3+1 - (2+1) = 1

第三关

acc = 1, val = 2, ind = 3
return value = 1+2 - (3+1) = -1

数组结尾

因此,-1从数组中返回,然后

-1 + (4-1) = -1 + 3 = 2

duplicate()函数返回,这实际上是正确的结果。

方法2:Array.prototype.forEach()

在此方法中,我们遍历数组,获取其总和,然后从中减去第一个(n-1)个自然数的总和,其中n是数组的长度,剩下的是重复两次的数,因此我们把它返还。

示例

const arr = [1,4,8,5,6,7,9,2,3,7];
const duplicate = a => {
   let sum = 0;
   const { length: n } = a;
   a.forEach(num => sum += num);
   return sum - ((n*(n-1))/2);
}
console.log(duplicate(arr));

输出结果

控制台中的输出将为-

7