题目重点:要求存在同一数字出现在每个数里,重复位置可各自被选。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 输入各数在10..99;按数组位置计数量,重复数视为不同元素。
- 全组必须共享某一个digit,不是任意两数分别有不同的共同digit。
解题路线
- 分别统计0..9出现于多少输入数。一个数两位相同只贡献一次,比如55不能把5计两次。
- 任何合法组都有公共数字d,因此组大小≤count[d];选择全部包含d的数便达到count[d],取最大即最优。
- 不能用连通分量代替。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组合?
