劍指offer系列-面試題-17 - 打印1到最大的n位數 (python)

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——名企面試官精講典型編程題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章