查找前 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 开始,累加器将最初赋值为第零个索引的值,因此总共将执行 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

更新于:2020-08-19

81 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告