Skip to content

Commit ebbea4b

Browse files
committed
feat: add solutions to lcof problem: No.17
1 parent 90dbf6a commit ebbea4b

File tree

5 files changed

+223
-77
lines changed

5 files changed

+223
-77
lines changed

lcof/面试题17. 打印从1到最大的n位数/README.md

Lines changed: 124 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -21,89 +21,165 @@
2121

2222
## 解法
2323

24+
**方法一:模拟**
25+
26+
直接根据题意模拟即可。
27+
28+
时间复杂度 $O(10^n)$,空间复杂度 $O(1)$。
29+
30+
如果 $n$ 的值比较大,那么直接使用整数会溢出,因此可以使用字符串来模拟,参考以下代码中的 `print()` 函数。
31+
2432
<!-- tabs:start -->
2533

2634
### **Python3**
2735

2836
```python
2937
class Solution:
3038
def printNumbers(self, n: int) -> List[int]:
31-
return [i for i in range(1, 10**n)]
39+
return list(range(1, 10**n))
40+
41+
def print(self, n: int) -> List[str]:
42+
def dfs(i, j):
43+
if i == j:
44+
ans.append("".join(s))
45+
return
46+
k = 0 if i else 1
47+
while k < 10:
48+
s.append(str(k))
49+
dfs(i + 1, j)
50+
s.pop()
51+
k += 1
52+
53+
ans = []
54+
s = []
55+
for i in range(1, n + 1):
56+
dfs(0, i)
57+
return ans
3258
```
3359

3460
### **Java**
3561

3662
```java
3763
class Solution {
3864
public int[] printNumbers(int n) {
39-
n = (int) Math.pow(10, n) - 1;
40-
int[] res = new int[n];
41-
for (int i = 0; i < n; ++i) {
42-
res[i] = i + 1;
65+
int[] ans = new int[(int) Math.pow(10, n) - 1];
66+
for (int i = 0; i < ans.length; ++i) {
67+
ans[i] = i + 1;
4368
}
44-
return res;
69+
return ans;
4570
}
46-
}
47-
```
4871

49-
### **JavaScript**
72+
private StringBuilder s = new StringBuilder();
73+
private List<String> ans = new ArrayList<>();
5074

51-
```js
52-
/**
53-
* @param {number} n
54-
* @return {number[]}
55-
*/
56-
var printNumbers = function (n) {
57-
let res = [];
58-
for (let i = 1; i < 10 ** n; ++i) {
59-
res.push(i);
75+
public List<String> print(int n) {
76+
for (int i = 1; i <= n; ++i) {
77+
dfs(0, i);
78+
}
79+
return ans;
6080
}
61-
return res;
62-
};
63-
```
64-
65-
### **Go**
6681

67-
```go
68-
func printNumbers(n int) []int {
69-
d := 10
70-
for i := 1; i < n; i++ {
71-
d *= 10
72-
}
73-
res := make([]int, d - 1)
74-
for i := 1; i < d; i++ {
75-
res[i - 1] = i
82+
private void dfs(int i, int j) {
83+
if (i == j) {
84+
ans.add(s.toString());
85+
return;
86+
}
87+
int k = i > 0 ? 0 : 1;
88+
for (; k < 10; ++k) {
89+
s.append(k);
90+
dfs(i + 1, j);
91+
s.deleteCharAt(s.length() - 1);
92+
}
7693
}
77-
return res
7894
}
7995
```
8096

8197
### **C++**
8298

83-
假设 `n` 很大,则需要用 dfs 枚举,并且返回字符串
84-
8599
```cpp
86100
class Solution {
87101
public:
88102
vector<int> printNumbers(int n) {
89-
vector<int> ans;
90-
string s;
91-
dfs(ans, s, 0, n);
103+
vector<int> ans(pow(10, n) - 1);
104+
iota(ans.begin(), ans.end(), 1);
92105
return ans;
93106
}
94107

95-
void dfs(vector<int>& ans, string& s, int k, int n) {
96-
if (k == n) {
97-
int num = atoi(s.c_str());
98-
if (num) ans.push_back(num);
99-
return;
100-
}
101-
for (int i = 0; i <= 9; ++i) {
102-
s += i + '0';
103-
dfs(ans, s, k + 1, n);
104-
s.pop_back();
108+
vector<string> print(int n) {
109+
vector<string> ans;
110+
string s;
111+
function<void(int, int)> dfs = [&](int i, int j) {
112+
if (i == j) {
113+
ans.push_back(s);
114+
return;
115+
}
116+
int k = i ? 0 : 1;
117+
for (; k < 10; ++k) {
118+
s.push_back(k + '0');
119+
dfs(i + 1, j);
120+
s.pop_back();
121+
}
122+
};
123+
for (int i = 1; i <= n; ++i) {
124+
dfs(0, i);
105125
}
126+
return ans;
127+
}
128+
};
129+
```
130+
131+
### **Go**
132+
133+
```go
134+
func printNumbers(n int) []int {
135+
n = int(math.Pow(10, float64(n))) - 1
136+
ans := make([]int, n)
137+
for i := range ans {
138+
ans[i] = i + 1
139+
}
140+
return ans
141+
}
142+
143+
func print(n int) []string {
144+
var dfs func(i, j int)
145+
s := []byte{}
146+
ans := []string{}
147+
dfs = func(i, j int) {
148+
if i == j {
149+
ans = append(ans, string(s))
150+
return
151+
}
152+
k := 0
153+
if i == 0 {
154+
k++
155+
}
156+
for k < 10 {
157+
s = append(s, byte('0'+k))
158+
dfs(i+1, j)
159+
s = s[:len(s)-1]
160+
k++
161+
}
162+
}
163+
for i := 1; i <= n; i++ {
164+
dfs(0, i)
165+
}
166+
return ans
167+
}
168+
```
169+
170+
### **JavaScript**
171+
172+
```js
173+
/**
174+
* @param {number} n
175+
* @return {number[]}
176+
*/
177+
var printNumbers = function (n) {
178+
let res = [];
179+
for (let i = 1; i < 10 ** n; ++i) {
180+
res.push(i);
106181
}
182+
return res;
107183
};
108184
```
109185

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,29 @@
11
class Solution {
22
public:
33
vector<int> printNumbers(int n) {
4-
vector<int> ans;
5-
string s;
6-
dfs(ans, s, 0, n);
4+
vector<int> ans(pow(10, n) - 1);
5+
iota(ans.begin(), ans.end(), 1);
76
return ans;
87
}
98

10-
void dfs(vector<int>& ans, string& s, int k, int n) {
11-
if (k == n) {
12-
int num = atoi(s.c_str());
13-
if (num) ans.push_back(num);
14-
return;
15-
}
16-
for (int i = 0; i <= 9; ++i) {
17-
s += i + '0';
18-
dfs(ans, s, k + 1, n);
19-
s.pop_back();
9+
vector<string> print(int n) {
10+
vector<string> ans;
11+
string s;
12+
function<void(int, int)> dfs = [&](int i, int j) {
13+
if (i == j) {
14+
ans.push_back(s);
15+
return;
16+
}
17+
int k = i ? 0 : 1;
18+
for (; k < 10; ++k) {
19+
s.push_back(k + '0');
20+
dfs(i + 1, j);
21+
s.pop_back();
22+
}
23+
};
24+
for (int i = 1; i <= n; ++i) {
25+
dfs(0, i);
2026
}
27+
return ans;
2128
}
22-
};
29+
};
Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,34 @@
11
func printNumbers(n int) []int {
2-
d := 10
3-
for i := 1; i < n; i++ {
4-
d *= 10
5-
}
6-
res := make([]int, d - 1)
7-
for i := 1; i < d; i++ {
8-
res[i - 1] = i
9-
}
10-
return res
2+
n = int(math.Pow(10, float64(n))) - 1
3+
ans := make([]int, n)
4+
for i := range ans {
5+
ans[i] = i + 1
6+
}
7+
return ans
8+
}
9+
10+
func print(n int) []string {
11+
var dfs func(i, j int)
12+
s := []byte{}
13+
ans := []string{}
14+
dfs = func(i, j int) {
15+
if i == j {
16+
ans = append(ans, string(s))
17+
return
18+
}
19+
k := 0
20+
if i == 0 {
21+
k++
22+
}
23+
for k < 10 {
24+
s = append(s, byte('0'+k))
25+
dfs(i+1, j)
26+
s = s[:len(s)-1]
27+
k++
28+
}
29+
}
30+
for i := 1; i <= n; i++ {
31+
dfs(0, i)
32+
}
33+
return ans
1134
}
Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,32 @@
11
class Solution {
22
public int[] printNumbers(int n) {
3-
n = (int) Math.pow(10, n) - 1;
4-
int[] res = new int[n];
5-
for (int i = 0; i < n; ++i) {
6-
res[i] = i + 1;
3+
int[] ans = new int[(int) Math.pow(10, n) - 1];
4+
for (int i = 0; i < ans.length; ++i) {
5+
ans[i] = i + 1;
6+
}
7+
return ans;
8+
}
9+
10+
private StringBuilder s = new StringBuilder();
11+
private List<String> ans = new ArrayList<>();
12+
13+
public List<String> print(int n) {
14+
for (int i = 1; i <= n; ++i) {
15+
dfs(0, i);
16+
}
17+
return ans;
18+
}
19+
20+
private void dfs(int i, int j) {
21+
if (i == j) {
22+
ans.add(s.toString());
23+
return;
24+
}
25+
int k = i > 0 ? 0 : 1;
26+
for (; k < 10; ++k) {
27+
s.append(k);
28+
dfs(i + 1, j);
29+
s.deleteCharAt(s.length() - 1);
730
}
8-
return res;
931
}
1032
}
Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,21 @@
11
class Solution:
22
def printNumbers(self, n: int) -> List[int]:
3-
return [i for i in range(1, 10**n)]
3+
return list(range(1, 10**n))
4+
5+
def print(self, n: int) -> List[str]:
6+
def dfs(i, j):
7+
if i == j:
8+
ans.append("".join(s))
9+
return
10+
k = 0 if i else 1
11+
while k < 10:
12+
s.append(str(k))
13+
dfs(i + 1, j)
14+
s.pop()
15+
k += 1
16+
17+
ans = []
18+
s = []
19+
for i in range(1, n + 1):
20+
dfs(0, i)
21+
return ans

0 commit comments

Comments
 (0)