Senior SWE · Onsite Coding 1

Apple Senior 数组题:只出现一次且相邻数都不存在

两遍扫描区分出现次数与数值邻居,保留输入顺序并处理重复、负数和整数边界。

题目重点:两遍扫描区分出现次数与数值邻居,保留输入顺序并处理重复、负数和整数边界。

题意与假设

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

  • 输入为整数列表,重复值应使该数不合格;邻居指数值差 1 而非数组中的相邻位置。
  • 训练版按原输入出现顺序返回合格值;若面试官要求升序,再对结果排序。Python 整数无溢出,固定宽度语言算 INT_MIN−1/INT_MAX+1 时须先防溢出。

解题路线

  1. 第一遍统计每个数出现次数;哈希表的键也充当数值存在集合。
  2. 第二遍按输入顺序扫描,只有 frequency[n]==1 且 n−1/n+1 都不在表中才输出。
  3. 由于合格值必须只出现一次,无需对输出再去重;对短数组用逐元素计数与逐邻居扫描作为独立参考。

手动走一遍

[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 内任意值,怎样权衡时间与空间?
✓已复制微信号!