题目重点:两篇电面记录明确比较两个 set 是否相同;训练版以可哈希元素为输入,解释集合相等和数组相等的区别。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练版接受两个可迭代的可哈希元素序列,以集合语义判断相等:顺序和重复次数不影响答案。
- 若现场传入的是真正 Set 容器,可直接用语言自带比较;若要求多重集合、元素对象自定义相等或流式迭代,算法和契约不同。
解题路线
- 先问清元素身份和重复语义:{1,2} 与 [1,1,2] 是否代表相同集合;训练版答案为是。
- 把两边转为 hash set 再比较,不修改原输入;先比较去重后大小,再逐项成员检查也等价。
- 若不能使用哈希,可复制后排序与去重比较,代价 O(N log N);对象不可哈希时需定义规范化键或比较器。
- 测试空/空、顺序反转、重复值不同、多一个元素、同长度不同元素和刻意哈希碰撞对象。
手动走一遍
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,怎样定义规范化和相等?
