在前 n 个项的级数中查找重复元素 JavaScript
javascriptweb developmentobject oriented programming更新于 2025/9/26 1:48:17
假设,我们给定一个包含前 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 返回值 = 2+3 - (1+1) = 3
第二次传递
acc = 3, val = 1, ind = 2 返回值 = 3+1 - (2+1) = 1
第三次
acc = 1, val = 2, ind = 3 返回值 = 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
相关文章
有用资源
javascript 参考教程 - 该教程包含有关 javascript 的更多信息:https://www.cainiaomax.com/javascript/

