Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /