1. 程式人生 > 遊戲資訊 >Perfecto:我們並不侷限於只贏下一次major冠軍

Perfecto:我們並不侷限於只贏下一次major冠軍

題目:劍指 Offer 17. 列印從1到最大的n位數
解題思路1:(非考點,不推薦這麼寫)

python無需考慮大數越界問題,直接一路輸出即可

class Solution:
    def printNumbers(self, n: int) -> List[int]:
        res = []
        for i in range(1, 10 ** n):
            res.append(i)
        return res
        # return [i for i in range(1, 10 ** n)]
        # return list(range(1, 10 ** n))
優質解答:全排列遞迴求解(參考自K神)

固定高位,遞迴列印後面的數字。設定開始位start,將數字的高位0去除;設定檢測值nine,當該位到達9後,下一個數字需要進位,此時控制start-1,即前移一位,回溯時需要將nine-1回到前一位。最後在將字串轉化為int放入列表中。

class Solution:
    def printNumbers(self, n: int) -> List[int]:
        def dfs(x):
            if x == n:
                s = ''.join(num[self.start:])
                if s != '0':    res.append(int(s))
                if n - self.start == self.nine:    self.start -= 1
                return
            for i in range(10):
                if i == 9:    self.nine += 1
                num[x] = str(i)
                dfs(x+1)
            self.nine -= 1

        num, res = ['0'] * n, []
        self.nine = 0
        self.start = n - 1
        dfs(0)
        return res