题目重点:先算输出数量,再讨论枚举器的有限演示与可行性。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 1000位十进制正整数,首位1..9,后999位0..9;不含leading zeros。
- 题目若把1000位字符串算数字,则数量10^1000;两种合同不可混用。
解题路线
- 1000位正整数共9×10^999个,从10^999到10^1000−1。每个至少输出1000字符,因此字符数至少9000×10^999,不存在实际一次完整打印的资源预算。
- 概念上维护1000位字符数组,从1000..0开始,末位加1逐位进位;输出每个状态直到999..9。流式避免保存全部结果,但仍受不可消除的输出量下界。
- 面试可用k=2展示10..99共90个,用k一般化计数9×10^(k−1),说明生成器O(k)状态。不能将“写出循环”包装成能在有限机器上完成1000位全输出。
手动走一遍
k2是90个,不是100个;09不是两位正整数。即使每秒输出10^12个数,也需要9×10^987秒,量级不能靠并行消除。
规模与取舍
k位数枚举Θ(k×9×10^(k−1))输出时间、O(k)状态;如果存全部结果,空间同输出量级。
易错点与追问
容易失分的边界
- 固定64位类型不能表示起点10^999。
- 只报循环控制O(1)而不计格式化及输出。
继续深挖
- 允许按prefix只输出一页时,怎样实现seek到第i个数?
- 如果真正要求打印1000个数字而不是1000位数,如何通过澄清识别?
