劍指 Offer 17 列印從1到最大的n位數

2021-10-22 03:22:35 字數 3490 閱讀 8449

輸入數字n,按順序列印出從 1 到最大的 n 位十進位制數。比如輸入 3,則列印出 1、2、3 一直到最大的 3 位數 999。

示例 1:

輸入: n = 1

輸出: [1,2,3,4,5,6,7,8,9]

越來越覺得越是簡單的問題,遇到大數的時候就越難想出來處理的方式,感覺像是一種思維上的定式限制了我會用別的方法去嘗試

首先是最好想到的解題思路:

題目要求列印 「從 11 至最大的 nn 位數的列表」 ,因此需考慮以下兩個問題:

最大的 n

nn 位數(記為 end

enden

d )和位數 n

nn的關係:例如最大的 1

11 位數是 9

99,最大的 2

22 位數是 99

9999

,最大的 3

33 位數是 999

99999

9 。則可推出公式:

e nd

=10n

−1end=10^n −1

end=10

n−1大數越界問題:當 n

nn 較大時,end

enden

d 會超出 int

32int32

int3

2 整型的取值範圍,超出取值範圍的數字無法正常儲存。但由於本題要求返回 int 型別陣列,相當於預設所有數字都在 int32 整型取值範圍內,因此不考慮大數越界問題。

因此,只需定義區間 [1,

10n−

1][1, 10^n - 1]

[1,10n

−1] 和步長 1

11 ,通過 for

forfo

r 迴圈生成結果列表 res

resre

s 並返回即可。

class

solution

:def

printnumbers

(self, n:

int)

-> list[

int]

: num =

pow(

10, n)

result =

[i for i in

range(1

, num)

]return result

大數列印解法:大神對於大數的乙個解法

表示大數的變數型別

生成數字的字串集

遞迴生成全排列

根據以上方法,可初步編寫全排列**:

class

solution

:def

printnumbers

(self, n:

int)

->

[int]:

defdfs

(x):

if x == n:

# 終止條件:已固定完所有位

''.join(num)

)# 拼接 num 並新增至 res 尾部

return

for i in

range(10

):# 遍歷 0 - 9

num[x]

=str

(i)# 固定第 x 位為 i

dfs(x +1)

# 開啟固定第 x + 1 位

num =

['0'

]* n # 起始數字定義為 n 個 0 組成的字元列表

res =

# 數字字串列表

dfs(0)

# 開啟全排列遞迴

return

','.join(res)

# 拼接所有數字字串,使用逗號隔開,並返回

在此方法下,各數字字串被逗號隔開,共同組成長字串。返回的數字集字串如下所示:

輸入:n =

1輸出:"0,1,2,3,4,5,6,7,8,9"

輸入:n =

2輸出:"00,01,02,...,10,11,12,...,97,98,99"

輸入:n =

3輸出:"000,001,002,...,100,101,102,...,997,998,999"

觀察可知,當前的生成方法仍有以下問題:

諸如 00,01

,02,⋯

00, 01, 02, \cdots

00,01,

02,⋯

應顯示為 0,1

,2,⋯

0, 1, 2, \cdots

0,1,2,

⋯ ,即應刪除高位多餘的 000;

此方法從 0

00 開始生成,而題目要求列表從 1

11 開始;

以上兩個問題的解決方法如下:

刪除高位多餘的 000:

列表從 1

11 開始:

正確表示大數,以下**的返回值為數字字串集拼接而成的長字串。

class

solution

:def

printnumbers

(self, n:

int)

->

[int]:

defdfs

(x):

if x == n:

s =''.join(num[self.start:])

if s !=

'0'if n - self.start == self.nine: self.start -=

1return

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

','.join(res)

劍指offer17 列印從1到最大的n位數

題目 輸入數字n,按順序列印從1到最大的n為十進位制數。比如輸入3,則列印出1,2,3一直到最大的3位數999。看到這個問題之後,最容易想到的辦法就是先求出最大的n位數,然後用乙個迴圈從1開始逐個列印。於是很容易寫出以下 void print1tomaxofndigits 1 int n for i...

劍指 Offer 17 列印從1到最大的n位數

題目 輸入乙個位數n,把1到最大的n位數 如當n 2時,為99 放到int裡返回。public int printnumbers int n 思路 1.直接用for來放入,不考慮大數問題。不考慮大數問題 public int printnumbers int n return array 2.當n變...

劍指 Offer 17 列印從1到最大的n位數

劍指 offer 17.列印從1到最大的n位數 題目描述 輸入數字n,按順序列印出從 1 到最大的 n 位十進位制數。比如輸入 3,則列印出 1 2 3 一直到最大的 3 位數 999。示例 輸入 n 1 輸出 1,2,3,4,5,6,7,8,9 說明 1.用返回乙個整數列表來代替列印 2.n 為正...