Applied Scientist Internship · Coding / OA

Amazon AS OA:利润和为 target,按数值去重计数

区分位置对与数值对,使用频表约束双元素自配,并以规范顺序避免重复。

题目重点:区分位置对与数值对,使用频表约束双元素自配,并以规范顺序避免重复。

题意与假设

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

  • 数值对无序,(a,b)与(b,a)同题答案;整数可为负。
  • 示例仅输出数量,若要求实际组合,返回满足条件的(a,target-a)。

解题路线

  1. Counter保留每个值频次。对每个不同a计算b=target-a,仅检查a≤b;b须存在,若a=b须count[a]≥2。
  2. 规范顺序保证每对仅由较小值负责;不同位置约束在a≠b时自动满足,因为两个不同值无法来自同一位置。a=b时显式频次检查补足。
  3. 若题目改为位置对数量,a≠b贡献count[a]·count[b],a=b贡献count[a](count[a]-1)/2;这与本题每种组合只记1差别很大。
  4. 排序双指针同样可做,但命中后须越过两侧重复;频表版本更直接表达题目“different profits”规则。

手动走一遍

训练例[1,1,3,3,2],target=4只有(1,3),(2,2)缺第二个2;追加2后为2种,而不是把所有位置组合计入。

Python 参考实现

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

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

from collections import Counter


def distinct_pairs(profits, target):
    counts = Counter(profits)
    return sum(1 for a in counts if a <= target-a
               and target-a in counts
               and (a != target-a or counts[a] >= 2))

复杂度

期望O(n)时间,O(u)空间;哈希期望界依实现,排序替代O(n log n)。

易错点与追问

容易失分的边界

  • set后直接允许唯一一个target/2自配。
  • 对两个方向分别计数。
  • 误用位置组合公式。

继续深挖

  • 要输出所有位置对复杂度下界是什么?
  • 数据流不断加入时怎样更新不同值对数?
  • 极大整数和溢出在固定宽度语言怎么处理?
✓已复制微信号!