题目重点:两遍扫描区分出现次数与数值邻居,保留输入顺序并处理重复、负数和整数边界。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 输入为整数列表,重复值应使该数不合格;邻居指数值差 1 而非数组中的相邻位置。
- 训练版按原输入出现顺序返回合格值;若面试官要求升序,再对结果排序。Python 整数无溢出,固定宽度语言算 INT_MIN−1/INT_MAX+1 时须先防溢出。
解题路线
- 第一遍统计每个数出现次数;哈希表的键也充当数值存在集合。
- 第二遍按输入顺序扫描,只有 frequency[n]==1 且 n−1/n+1 都不在表中才输出。
- 由于合格值必须只出现一次,无需对输出再去重;对短数组用逐元素计数与逐邻居扫描作为独立参考。
手动走一遍
[4,2,4,9,8,13] 中 4 重复淘汰;9 与 8 互为邻居而淘汰;2 和 13 各只出现一次,且 1/3、12/14 均缺席,结果 [2,13]。数值相邻和位置相邻是两回事。
Python 参考实现
下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。
代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。
from collections import Counter
def isolated_singletons(numbers: list[int]) -> list[int]:
"""Preserve input order while selecting unique values with no ±1 neighbor."""
frequency = Counter(numbers)
return [
value
for value in numbers
if frequency[value] == 1
and value - 1 not in frequency
and value + 1 not in frequency
]
复杂度
平均 O(n) 时间、O(u) 额外空间,u 为不同整数数目;哈希表恶意碰撞或排序版会改变保证。要 O(1) 额外空间须允许改变数组并排序,代价通常 O(n log n)。
易错点与追问
容易失分的边界
- 只判断 n 的左右数组元素是否相差 1。
- 只用 set,忘记 n 本身必须恰好出现一次。
- 对原数组排序后无说明地改变输出顺序。
- 固定宽度整数在 n±1 处溢出。
继续深挖
- 如果不允许额外数据结构且可以修改输入,如何排序后单次扫描?
- 若数据是流,能否在结束前确定某个 n 必定合格?
- 若邻居改为距离 d 内任意值,怎样权衡时间与空间?
