Skip to content

Commit 10320bf

Browse files
committed
feat: leetcode 1805
1 parent 6c206a2 commit 10320bf

File tree

7 files changed

+138
-0
lines changed

7 files changed

+138
-0
lines changed

assets/data/categories.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2069,6 +2069,12 @@
20692069
"title": "交替合并字符串",
20702070
"path": "./problemset/merge-strings-alternately/README.md",
20712071
"difficulty": "简单"
2072+
},
2073+
{
2074+
"id": "1805",
2075+
"title": "字符串中不同整数的数目",
2076+
"path": "./problemset/number-of-different-integers-in-a-string/README.md",
2077+
"difficulty": "简单"
20722078
}
20732079
]
20742080
},

assets/data/topics.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5279,6 +5279,16 @@
52795279
"url": "https://leetcode.cn/problems/maximum-ascending-subarray-sum/",
52805280
"path": "./problemset/maximum-ascending-subarray-sum/README.md"
52815281
},
5282+
{
5283+
"id": "1805",
5284+
"title": {
5285+
"cn": "字符串中不同整数的数目",
5286+
"en": "number-of-different-integers-in-a-string"
5287+
},
5288+
"difficulty": "简单",
5289+
"url": "https://leetcode.cn/problems/number-of-different-integers-in-a-string/",
5290+
"path": "./problemset/number-of-different-integers-in-a-string/README.md"
5291+
},
52825292
{
52835293
"id": "1822",
52845294
"title": {

assets/docs/CATEGORIES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,7 @@
382382
| 1417. [重新格式化字符串](../../problemset/reformat-the-string/README.md) | 简单 |
383383
| 1455. [检查单词是否为句中其他单词的前缀](../../problemset/check-if-a-word-occurs-as-a-prefix-of-any-word-in-a-sentence/README.md) | 简单 |
384384
| 1768. [交替合并字符串](../../problemset/merge-strings-alternately/README.md) | 简单 |
385+
| 1805. [字符串中不同整数的数目](../../problemset/number-of-different-integers-in-a-string/README.md) | 简单 |
385386

386387
## 模拟
387388

assets/docs/TOPICS.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1056,6 +1056,8 @@
10561056

10571057
[1800. 最大升序子数组和](../../problemset/maximum-ascending-subarray-sum/README.md)
10581058

1059+
[1805. 字符串中不同整数的数目](../../problemset/number-of-different-integers-in-a-string/README.md)
1060+
10591061
[1822. 数组元素积的符号](../../problemset/sign-of-the-product-of-an-array/README.md)
10601062

10611063
[1823. 找出游戏的获胜者](../../problemset/find-the-winner-of-the-circular-game/README.md)
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
# 字符串中不同整数的数目
2+
3+
> 难度:简单
4+
>
5+
> https://leetcode.cn/problems/number-of-different-integers-in-a-string/
6+
7+
## 题目
8+
9+
给你一个字符串 `word` ,该字符串由数字和小写英文字母组成。
10+
11+
请你用空格替换每个不是数字的字符。例如,"a123bc34d8ef34" 将会变成 " 123 34 8 34" 。注意,剩下的这些整数为(相邻彼此至少有一个空格隔开):"123"、"34"、"8" 和 "34" 。
12+
13+
返回对 `word` 完成替换后形成的 **不同** 整数的数目。
14+
15+
只有当两个整数的 **不含前导零** 的十进制表示不同, 才认为这两个整数也不同。
16+
17+
### 示例
18+
19+
#### 示例 1:
20+
21+
```
22+
输入:word = "a123bc34d8ef34"
23+
输出:3
24+
解释:不同的整数有 "123"、"34" 和 "8" 。注意,"34" 只计数一次。
25+
```
26+
27+
#### 示例 2:
28+
29+
```
30+
输入:word = "leet1234code234"
31+
输出:2
32+
```
33+
34+
#### 示例 3:
35+
36+
```
37+
输入:word = "a1b01c001"
38+
输出:1
39+
解释:"1"、"01" 和 "001" 视为同一个整数的十进制表示,因为在比较十进制值时会忽略前导零的存在。
40+
```
41+
42+
## 解题
43+
44+
```ts
45+
/**
46+
* 双指针
47+
* @desc 时间复杂度 O(N) 空间复杂度 O(N)
48+
* @param word
49+
* @returns
50+
*/
51+
export function numDifferentIntegers(word: string): number {
52+
const isDigit = (ch: string) => ch >= '0' && ch <= '9'
53+
54+
const set = new Set()
55+
const n = word.length; let p1 = 0; let p2
56+
while (true) {
57+
while (p1 < n && !isDigit(word[p1]))
58+
p1++
59+
if (p1 === n)
60+
break
61+
62+
p2 = p1
63+
while (p2 < n && isDigit(word[p2]))
64+
p2++
65+
66+
while (p2 - p1 > 1 && word[p1] === '0')
67+
p1++
68+
69+
set.add(word.slice(p1, p2))
70+
p1 = p2
71+
}
72+
return set.size
73+
}
74+
```
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { describe, expect, it } from 'vitest'
2+
import { numDifferentIntegers } from '.'
3+
4+
describe('字符串中不同整数的数目', () => {
5+
testCase(numDifferentIntegers)
6+
})
7+
8+
function testCase(fn: (word: string) => number) {
9+
it.each([
10+
['a123bc34d8ef34', 3],
11+
['leet1234code234', 2],
12+
['a1b01c001', 1],
13+
])('示例%#', (word, expected) => {
14+
expect(fn(word)).toBe(expected)
15+
})
16+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/**
2+
* 双指针
3+
* @desc 时间复杂度 O(N) 空间复杂度 O(N)
4+
* @param word
5+
* @returns
6+
*/
7+
export function numDifferentIntegers(word: string): number {
8+
const isDigit = (ch: string) => ch >= '0' && ch <= '9'
9+
10+
const set = new Set()
11+
const n = word.length; let p1 = 0; let p2
12+
while (true) {
13+
while (p1 < n && !isDigit(word[p1]))
14+
p1++
15+
if (p1 === n)
16+
break
17+
18+
p2 = p1
19+
while (p2 < n && isDigit(word[p2]))
20+
p2++
21+
22+
while (p2 - p1 > 1 && word[p1] === '0')
23+
p1++
24+
25+
set.add(word.slice(p1, p2))
26+
p1 = p2
27+
}
28+
return set.size
29+
}

0 commit comments

Comments
 (0)