然后面试官问:“你能用更少的代码做到这一点吗?”
我喜欢用有趣的方法解决面试问题。在准备面试时,我认为了解任何特定语言的功能和数据结构都很重要,因为它们能帮助你更有效地解决琐碎的问题。
我曾经遇到过一个有趣的面试问题是:“给定一个包含 n 个数字的数组,如何查找其中是否有重复的数字?”
作为一名初级 JavaScript 开发者,当我遇到这个问题时,我以为解决方案很简单。只需对数组进行排序,然后循环遍历,同时比较当前索引和前一个索引。如果匹配,则发现重复项!
const duplicateCheck = (numbers) => {
// Sort the numbers
numbers = numbers.sort();
// Loop through the numbers
for (let i = 0; i < numbers.length; i++) {
if (i > 0) {
// Compare the current index with the previous
if (numbers[i] === numbers[i-1]) {
// If they match we found a duplicate, we can stop here
return true;
}
}
}
return false;
};
当然,这行得通,面试官看起来也很高兴,但他们会问:“能不能再快点?” 然后你意识到,这或许并非最佳方案……虽然初始排序相当快,时间复杂度为Θ(n log(n))
,但我们在它之后还有一个循环,时间复杂度为Θ(n)
。最终,函数本身的运行速度为Θ(n log(n))
,它可能不是最快的解决方案。
好吧,让我们把它简化成一个循环。我们可以循环遍历未排序的数组,并跟踪已经找到的值。如果我们最终找到了一个我们已经检查过的值,那么我们就知道有重复的值,就可以停下来了。
const duplicateCheck = (numbers) => {
// Store found numbers
const found = {};
// Loop through the numbers
for (let number of numbers) {
// If number has been seen
if (found[number]) {
// End it here, we found a duplicate
return true;
} else {
// If we didn't see it yet, let's log that we've seen it once
found[number] = true;
}
}
return false;
};
这更简洁、更快!由于我们循环遍历数组,但跳过了排序,所以时间复杂度现在Θ(n)
为。这是一个更快的解决方案,你开始对面试的进展感到满意。然后面试官会问:“你能用更少的代码做到这一点吗?”
在你心跳加速、恐惧袭来之后,你想起了朋友(我)说过的一句话:“理解任何给定语言的功能和数据结构都很重要。”在 JavaScript 中,你可以访问Set
对象!
Set 对象是值的集合。您可以按插入顺序迭代 Set 中的元素。Set 中的值只能出现一次;它在 Set 的集合中是唯一的。
因此,您可以这样写:
const duplicateCheck = (a) => new Set(a).size !== a.length;
通过将数组传递给 new Set
,您知道 Set 不允许添加任何重复元素。现在您有一个没有重复项的可迭代对象。最后一步是将去重后的大小Set
与原始数组的长度进行比较。如果它们相同,则没有重复项。如果它们不同,则表明重复项已被删除。
现在你有了一个解决方案,它的时间复杂度保持在 ,Θ(n)
不需要 for 循环,也不需要跟踪已经见过的数字。相反,你有一个简洁的一行代码即可解决。
我喜欢这些一行代码就能解决的问题!希望对你有帮助。如果你有任何有趣或巧妙的面试题解决方案,欢迎在评论区留言。或者,如果你有更好的数组重复查找方案,也欢迎分享。
想随时了解我的最新动态,请在Twitter和dev.to上关注我。如果你想“给我看看代码!”,可以在GitHub上找到我。
鏂囩珷鏉yu簮锛�https://dev.to/michaelsolati/and-then-the-interviewer-asks-can-you-do-this-with-less-code-2g02