然后面试官问:“你能用更少的代码做到这一点吗?”

2025-06-09

然后面试官问:“你能用更少的代码做到这一点吗?”

我喜欢用有趣的方法解决面试问题。在准备面试时,我认为了解任何特定语言的功能和数据结构都很重要,因为它们能帮助你更有效地解决琐碎的问题。

我曾经遇到过一个有趣的面试问题是:“给定一个包含 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;
};
Enter fullscreen mode Exit fullscreen mode

当然,这行得通,面试官看起来也很高兴,但他们会问:“能不能再快点?” 然后你意识到,这或许并非最佳方案……虽然初始排序相当快,时间复杂度为Θ(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;
};
Enter fullscreen mode Exit fullscreen mode

这更简洁、更快!由于我们循环遍历数组,但跳过了排序,所以时间复杂度现在Θ(n)为。这是一个更快的解决方案,你开始对面试的进展感到满意。然后面试官会问:“你能用更少的代码做到这一点吗?”

在你心跳加速、恐惧袭来之后,你想起了朋友(我)说过的一句话:“理解任何给定语言的功能和数据结构都很重要。”在 JavaScript 中,你可以访问Set对象!

Set 对象是值的集合。您可以按插入顺序迭代 Set 中的元素。Set 中的值只能出现一次;它在 Set 的集合中是唯一的。

因此,您可以这样写:

const duplicateCheck = (a) => new Set(a).size !== a.length;
Enter fullscreen mode Exit fullscreen mode

通过将数组传递给 new Set,您知道 Set 不允许添加任何重复元素。现在您有一个没有重复项的可迭代对象。最后一步是将去重后的大小Set与原始数组的长度进行比较。如果它们相同,则没有重复项。如果它们不同,则表明重复项已被删除。

现在你有了一个解决方案,它的时间复杂度保持在 ,Θ(n)不需要 for 循环,也不需要跟踪已经见过的数字。相反,你有一个简洁的一行代码即可解决。

我喜欢这些一行代码就能解决的问题!希望对你有帮助。如果你有任何有趣或巧妙的面试题解决方案,欢迎在评论区留言。或者,如果你有更好的数组重复查找方案,也欢迎分享。


想随时了解我的最新动态,请在Twitterdev.to上关注我。如果你想“给我看看代码!”,可以在GitHub上找到我。

鏂囩珷鏉yu簮锛�https://dev.to/michaelsolati/and-then-the-interviewer-asks-can-you-do-this-with-less-code-2g02
PREV
很高兴加入 DEV 团队!
NEXT
我使用 WebRTC 与你 - 使用 JavaScript 构建视频聊天