文章目录
1. 题目2. 解题思路3. 代码实现3.1 无意义解法3.2 考虑大数问题
4. 总结5. 参考文献
1. 题目
输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印1、2、3一直到最大的3位数999。
2. 解题思路
其实,本题的考点在于,当输入的n很大是,求的最大的n位数字是否会溢出,也就是需要考虑"大数问题"。作者考察的是在字符创上模拟数字加法来绕过"大数问题"。
详情 见java剑指offer原题解法
3. 代码实现
3.1 无意义解法
class Solution:
def print_numbers(self
, n
):
"""
"""
return list(range(1, 10**n
)
3.2 考虑大数问题
class Solution:
def __init__(self
):
self
.result
= []
def printNumbers(self
, n
: int) -> List
[int]:
if n
<= 0:
return []
number
= ["0"]*n
number
[-1] = "1"
for i
in range(0, 10):
number
[0] = chr(ord("0")+i
)
self
.Print1ToMaxOfDigitsRecursively
(number
, n
, 0)
return (self
.result
[1:])
def Print1ToMaxOfDigitsRecursively(self
, number
, length
, index
):
if index
== length
- 1:
self
.PrintNumberNormal
(number
)
self
.result
.append
(int("".join
(number
)))
return
for i
in range(10):
number
[index
+1] = chr(ord("0")+i
)
self
.Print1ToMaxOfDigitsRecursively
(number
, length
, index
+1)
def PrintNumberNormal(self
, number
):
number
= int("".join
(number
))
if number
!= 0:
print(number
)
4. 总结
其实,本题的考点在于,当输入的n很大是,求的最大的n位数字是否会溢出,也就是需要考虑"大数问题"。
5. 参考文献
[1] 剑指offer丛书 [2] 剑指Offer——名企面试官精讲典型编程题