輸入數字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 為正...