题目重点:Phone Screen 两段题给数字列表与 lower bound,需保留数字重数、处理前导零并求最小可行排列。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 输入是 0..9 的单个数字列表,使用每个元素恰一次排列;允许前导零,最后把所得数规范成十进制字符串(去前导零,全零为 '0')。这是 [0,4,0]→'4' 所要求的口径。
- 追问要求数值严格 > lower bound,lower bound 为非负整数;把 bound 左补零到输入长度比较,固定长度串的词典序与其数值序一致。
- 如果找不到可行排列返回明确无解值,题目没有规定。
解题路线
- 基础题将所有数字升序拼接再去前导零;[0,0,4] 排成 '004',规范化得 '4'。固定长度排列中升序字符串数值最小。
- 追问先设 L 为数字个数;若 lower bound≥10^L−1 则无解,否则把其十进制写法左补零到 L 位。
- 用频次数组按位置从小到大试可用数字,包括首位 0;保持前缀与补零 bound 的大小关系,一旦前缀严格大于,就将剩余数字升序填完。完整候选须严格大于 bound。
- 回溯时重复数字只按值选择一次;按升序枚举前缀,首个完整合法固定长度字符串对应最小数值,最后去前导零输出。
手动走一遍
[7,1,8] 的基础最小是 178。lower=200 时首位 1 不够,下一可用 7,剩余 1/8 升序得 718;lower=179 时 178 不够,保持首位 1、次位 8,余 7,得 187。[0,4,0] 升序为 '004',输出规范字符串 '4',与题目示例一致。
规模与取舍
基础排序 O(L log L)。追问按升序回溯最坏需枚举 L!/(各数字频数阶乘) 个不同排列,剪枝可大幅减少;状态 DP/可行性记忆可控制重复子问题,L 只含十种数字可用频次数组。
易错点与追问
容易失分的边界
- 输入有重复数字却按下标排列,重复搜索。
- 把严格大于写成大于等于。
- 错误禁止前导零,使 [0,4,0] 输出 400 而不是 4。
- 直接比较未补零的不同长度字符串。
- 只找下一个排列而没考虑原始输入顺序无关。
继续深挖
- 若改成禁止前导零,最小数怎样变化?
- 若 lower 为负数怎么办?
- 如何用频次 DP 避免枚举所有排列?
- 若输入数字长度达十万,如何直接构造最小可行?
