剑指 Offer 17. 打印从1到最大的n位数
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
示例 1:
输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]
1.不考虑大数时**************************************************************************************
Python
方法1:
- 寻找最后一个数9XX9,
- 从1开始向数组中添数,到最后一个数为止
class Solution:
def printNumbers(self, n: int) -> List[int]:
m = 0
out = []
num = 1
for i in range(n):
m = m + 9*pow(10,i)
while num <= m:
out.append(num)
num+=1
return out
方法优化:
利用range直接生成即可
class Solution:
def printNumbers(self, n: int) -> List[int]:
res = []
for i in range(1, 10 ** n):
res.append(i)
return res
C++
方法1:
class Solution {
public:
vector<int> printNumbers(int n) {
int m = 0;
int num = 1;
vector<int> a;
for(int i=0 ; i<n;i++){
m = m +9*pow(10,i);
}
for(int num=1; num<=m;num++){
a.push_back(num);
}
return a;
}
};
2.考虑大数时****************************************************************************************
考虑大数时只能通过排列的方式打印
class Solution:
def printNumbers(self, n: int) -> [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