SWE IC15 · Phone Coding

Pinterest SetEquals:顺序、重复值与集合语义

两篇电面记录明确比较两个 set 是否相同;训练版以可哈希元素为输入,解释集合相等和数组相等的区别。

题目重点:两篇电面记录明确比较两个 set 是否相同;训练版以可哈希元素为输入,解释集合相等和数组相等的区别。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练版接受两个可迭代的可哈希元素序列,以集合语义判断相等:顺序和重复次数不影响答案。
  • 若现场传入的是真正 Set 容器,可直接用语言自带比较;若要求多重集合、元素对象自定义相等或流式迭代,算法和契约不同。

解题路线

  1. 先问清元素身份和重复语义:{1,2} 与 [1,1,2] 是否代表相同集合;训练版答案为是。
  2. 把两边转为 hash set 再比较,不修改原输入;先比较去重后大小,再逐项成员检查也等价。
  3. 若不能使用哈希,可复制后排序与去重比较,代价 O(N log N);对象不可哈希时需定义规范化键或比较器。
  4. 测试空/空、顺序反转、重复值不同、多一个元素、同长度不同元素和刻意哈希碰撞对象。

手动走一遍

left=[3,1,1]、right=[1,3],转集合后都为 {1,3},返回 true;left=[1,2]、right=[1,3] 长度同为 2,但集合不同,返回 false。

Python 参考实现

下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。

代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。

"""Set equality for iterable inputs with hashable elements."""


def set_equals(left, right) -> bool:
    return set(left) == set(right)

复杂度

哈希均匀且元素可哈希时,N+M 项建集合与比较期望 O(N+M) 时间、O(U) 额外空间,U 为总不同元素数;病态碰撞最坏性能依实现而变。排序比较 O((N+M)log(N+M))。

易错点与追问

容易失分的边界

  • 比较原数组长度和元素位置,误把序列相等当集合相等。
  • 只比较去重后数量,相同数量但元素不同也判 true。
  • 输入有不可哈希对象仍直接调用 set。
  • 把可能存在复杂自定义哈希/相等方法的最坏情况一律说成 O(1)。

继续深挖

  • 如果重复次数也必须相同,应使用什么结构?
  • 输入太大装不进内存时,如何外部排序精确比较?
  • 若元素是嵌套 JSON,怎样定义规范化和相等?
✓已复制微信号!