Skip to content

Commit 117c623

Browse files
committed
feat: add solutions to lc problems: No.1012,2376
* No.1012.Numbers With Repeated Digits * No.2376.Count Special Integers
1 parent e49af42 commit 117c623

File tree

4 files changed

+716
-0
lines changed

4 files changed

+716
-0
lines changed

solution/1000-1099/1012.Numbers With Repeated Digits/README.md

+179
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,36 @@ class Solution:
105105
return ans
106106
```
107107

108+
```python
109+
class Solution:
110+
def numDupDigitsAtMostN(self, n: int) -> int:
111+
return n - self.f(n)
112+
113+
def f(self, n):
114+
@cache
115+
def dfs(pos, mask, lead, limit):
116+
if pos <= 0:
117+
return lead ^ 1
118+
up = a[pos] if limit else 9
119+
ans = 0
120+
for i in range(up + 1):
121+
if (mask >> i) & 1:
122+
continue
123+
if i == 0 and lead:
124+
ans += dfs(pos - 1, mask, lead, limit and i == up)
125+
else:
126+
ans += dfs(pos - 1, mask | 1 << i, False, limit and i == up)
127+
return ans
128+
129+
a = [0] * 11
130+
l = 0
131+
while n:
132+
l += 1
133+
a[l] = n % 10
134+
n //= 10
135+
return dfs(l, 0, True, True)
136+
```
137+
108138
### **Java**
109139

110140
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -152,6 +182,54 @@ class Solution {
152182
}
153183
```
154184

185+
```java
186+
class Solution {
187+
private int[] a = new int[11];
188+
private int[][] dp = new int[11][1 << 11];
189+
190+
public int numDupDigitsAtMostN(int n) {
191+
return n - f(n);
192+
}
193+
194+
private int f(int n) {
195+
for (var e : dp) {
196+
Arrays.fill(e, -1);
197+
}
198+
int len = 0;
199+
while (n > 0) {
200+
a[++len] = n % 10;
201+
n /= 10;
202+
}
203+
return dfs(len, 0, true, true);
204+
}
205+
206+
private int dfs(int pos, int mask, boolean lead, boolean limit) {
207+
if (pos <= 0) {
208+
return lead ? 0 : 1;
209+
}
210+
if (!lead && !limit && dp[pos][mask] != -1) {
211+
return dp[pos][mask];
212+
}
213+
int up = limit ? a[pos] : 9;
214+
int ans = 0;
215+
for (int i = 0; i <= up; ++i) {
216+
if (((mask >> i) & 1) == 1) {
217+
continue;
218+
}
219+
if (i == 0 && lead) {
220+
ans += dfs(pos - 1, mask, lead, limit && i == up);
221+
} else {
222+
ans += dfs(pos - 1, mask | 1 << i, false, limit && i == up);
223+
}
224+
}
225+
if (!lead && !limit) {
226+
dp[pos][mask] = ans;
227+
}
228+
return ans;
229+
}
230+
}
231+
```
232+
155233
### **C++**
156234

157235
```cpp
@@ -197,6 +275,51 @@ public:
197275
};
198276
```
199277
278+
```cpp
279+
class Solution {
280+
public:
281+
int a[11];
282+
int dp[11][1 << 11];
283+
284+
int numDupDigitsAtMostN(int n) {
285+
return n - f(n);
286+
}
287+
288+
int f(int n) {
289+
memset(dp, -1, sizeof dp);
290+
int len = 0;
291+
while (n) {
292+
a[++len] = n % 10;
293+
n /= 10;
294+
}
295+
return dfs(len, 0, true, true);
296+
}
297+
298+
int dfs(int pos, int mask, bool lead, bool limit) {
299+
if (pos <= 0) {
300+
return lead ? 0 : 1;
301+
}
302+
if (!lead && !limit && dp[pos][mask] != -1) {
303+
return dp[pos][mask];
304+
}
305+
int up = limit ? a[pos] : 9;
306+
int ans = 0;
307+
for (int i = 0; i <= up; ++i) {
308+
if ((mask >> i) & 1) continue;
309+
if (i == 0 && lead) {
310+
ans += dfs(pos - 1, mask, lead, limit && i == up);
311+
} else {
312+
ans += dfs(pos - 1, mask | 1 << i, false, limit && i == up);
313+
}
314+
}
315+
if (!lead && !limit) {
316+
dp[pos][mask] = ans;
317+
}
318+
return ans;
319+
}
320+
};
321+
```
322+
200323
### **Go**
201324

202325
```go
@@ -246,6 +369,62 @@ func A(m, n int) int {
246369
}
247370
```
248371

372+
```go
373+
func numDupDigitsAtMostN(n int) int {
374+
return n - f(n)
375+
}
376+
377+
func f(n int) int {
378+
a := make([]int, 11)
379+
dp := make([][]int, 11)
380+
for i := range dp {
381+
dp[i] = make([]int, 1<<11)
382+
for j := range dp[i] {
383+
dp[i][j] = -1
384+
}
385+
}
386+
l := 0
387+
for n > 0 {
388+
l++
389+
a[l] = n % 10
390+
n /= 10
391+
}
392+
var dfs func(int, int, bool, bool) int
393+
dfs = func(pos, mask int, lead, limit bool) int {
394+
if pos <= 0 {
395+
if lead {
396+
return 0
397+
}
398+
return 1
399+
}
400+
if !lead && !limit && dp[pos][mask] != -1 {
401+
return dp[pos][mask]
402+
}
403+
ans := 0
404+
up := 9
405+
if limit {
406+
up = a[pos]
407+
}
408+
for i := 0; i <= up; i++ {
409+
if ((mask >> i) & 1) == 1 {
410+
continue
411+
}
412+
if i == 0 && lead {
413+
ans += dfs(pos-1, mask, lead, limit && i == up)
414+
} else {
415+
ans += dfs(pos-1, mask|1<<i, false, limit && i == up)
416+
}
417+
}
418+
if !lead && !limit {
419+
dp[pos][mask] = ans
420+
}
421+
return ans
422+
}
423+
424+
return dfs(l, 0, true, true)
425+
}
426+
```
427+
249428
### **...**
250429

251430
```

0 commit comments

Comments
 (0)