【发布时间】:2021-04-12 14:54:04
【问题描述】:
这是在给定数组中查找重复项的简单 LeetCode 函数。
function findDuplicates(nums) {
let hash = {}
for (let i = 0; i < nums.length; i++) {
if (!hash[nums[i]]) {
hash[nums[i]] = true
} else {
return true
}
}
return false
}
效果很好。但是如果我们改用 forEach 方法会发生什么?
function findDuplicates(nums) {
let hash = {}
nums.forEach(el => {
if (!hash[el]) {
hash[el] = true
} else {
return true
}
});
return false
}
此函数不适用于[0,4,5,3,0,6] 的相同输入。
您能否解释一下为什么这两种解决方案会给出不同的结果?或者只是为我指明正确的方向。
【问题讨论】:
-
在第一个示例中,您在
findDuplicates函数中是returning,立即停止它。在第二个中,您是forEach中的returning,这不会阻止其他迭代的运行(对于return中的forEach中的值是无用的,因为它不能在任何地方使用) -
改用
for (const el of nums) {。另外我会推荐Set而不是hash = {}。 -
... 或者,使用
every,简单地使用return nums.every((el, i) => nums.indexOf(el) === i);(没有任何for或forEach) -
@blex 这个函数的bigO是什么?使用 hash = {} 使其 O(n)
-
我不知道如何计算它,但是是的,使用它比将遇到的值存储在
hash变量中效率低(对于every元素,它将执行indexOf,它也会在内部循环)。在大多数日常使用中无关紧要(它使代码更易于阅读 IMO,并且时间差异不会很明显),但如果您拥有庞大的数据集,它确实会产生影响
标签: javascript arrays loops