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) # ord 是將一個字符轉換成 ASCII 碼,chr 是將一個 ASCII 碼轉換成一個數字
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——名企面試官精講典型編程題