1. 项目概述
题目"剑指offer-77、打印从1到最⼤的n位数"是一个经典的编程面试题,主要考察对大数处理和递归算法的理解。题目要求:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数999。
这个看似简单的问题实际上隐藏着几个关键考察点:
- 大数处理:当n很大时(比如n=100),常规的整数类型无法存储
- 递归思想:如何优雅地生成所有可能的数字组合
- 前导零处理:如何避免打印出像"001"这样的数字
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心算法解析
2.1 问题本质分析
这个问题表面上是一个简单的数字打印问题,但实际上需要解决两个核心挑战:
-
大数表示问题:当n较大时(如n=100),最大的n位数是10^100-1,这远远超出了任何编程语言基本数据类型的表示范围。因此不能简单地用循环从1递增打印。
-
全排列生成问题:需要生成所有n位数(实际上是1到n位所有数字)的排列组合,同时要处理前导零的问题。
2.2 递归解法详解
递归是解决这个问题的优雅方式。我们可以把问题看作是一个数字排列组合的问题,每一位都可以是0-9中的一个数字,通过递归来生成所有可能的组合。
python复制def printNumbers(n):
def dfs(index, num, digit):
if index == digit:
res.append(''.join(num))
return
for i in range(10):
num[index] = str(i)
dfs(index + 1, num, digit)
res = []
for digit in range(1, n+1):
num = ['0'] * digit
for first in range(1, 10):
num[0] = str(first)
dfs(1, num, digit)
return res
这个解法的工作原理:
- 外层循环控
