技术岗位 · Coding

两位数共同数字分组:统计全组共享的数字

要求存在同一数字出现在每个数里,重复位置可各自被选。

题目重点:要求存在同一数字出现在每个数里,重复位置可各自被选。

题意与假设

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

  • 输入各数在10..99;按数组位置计数量,重复数视为不同元素。
  • 全组必须共享某一个digit,不是任意两数分别有不同的共同digit。

解题路线

  1. 分别统计0..9出现于多少输入数。一个数两位相同只贡献一次,比如55不能把5计两次。
  2. 任何合法组都有公共数字d,因此组大小≤count[d];选择全部包含d的数便达到count[d],取最大即最优。
  3. 不能用连通分量代替。12、23、31两两有关联但没有全组共享数字,最大组只有2。

手动走一遍

[55,58,25,45]四项都包含5,答案4;[55,66,77]答案1。[11,11,21]包含1的数组位置有3个,因此答案3。

Python 参考实现

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

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

def largest_shared_digit_group(a):
    if any(type(x) is not int or not 10 <= x <= 99 for x in a):
        raise ValueError("two-digit positive integers required")
    counts = [0] * 10
    for x in a:
        for digit in {x // 10, x % 10}:
            counts[digit] += 1
    return max(counts, default=0)

复杂度

O(n)时间、O(1)额外空间,10个计数。返回实际成员需O(answer)输出。

易错点与追问

容易失分的边界

  • “任意两数共享”比“所有数共享同一个digit”是不同合同,不能直接套用最大桶。
  • 个位0有效,但不允许把一位数按前导0补成两位数。

继续深挖

  • 推广为任意长度十进制字符串,怎样每个输入去重digit?
  • 若每对共享但不要求全组共同,最多如何枚举digit-mask组合?
✓已复制微信号!