「每日LeetCode」2022年12月6日

本文最后更新于:2023年3月19日 晚上

1805.字符串中不同整数的数目

1805.字符串中不同整数的数目

Category Difficulty Likes Dislikes
algorithms Easy (45.00%) 59 -

Tags
Companies
给你一个字符串 word ,该字符串由数字和小写英文字母组成。
请你用空格替换每个不是数字的字符。例如,”a123bc34d8ef34” 将会变成 “ 123 34 8 34” 。注意,剩下的这些整数为(相邻彼此至少有一个空格隔开):”123”、”34”、”8” 和 “34” 。
返回对 word 完成替换后形成的 不同 整数的数目。
只有当两个整数的 不含前导零 的十进制表示不同, 才认为这两个整数也不同。

示例 1:
输入:word = “a123bc34d8ef34” 输出:3 解释:不同的整数有 “123”、”34” 和 “8” 。注意,”34” 只计数一次。
示例 2:
输入:word = “leet1234code234” 输出:2
示例 3:
输入:word = “a1b01c001” 输出:1 解释:”1”、”01” 和 “001” 视为同一个整数的十进制表示,因为在比较十进制值时会忽略前导零的存在。

提示:

  • 1 <= word.length <= 1000
  • word 由数字和小写英文字母组成

Discussion | Solution

思路

首先,函数会在输入字符串的末尾添加一个“$”字符。然后,它会使用一个正则表达式来测试该字符串中的每个字符,看它是否是一个数字(即 0 到 9 之间的数字)。如果该字符是一个数字,并且还没有开始记录一串数字,那么函数会设置一个标志来表示已经开始了一串数字,并记录下该串数字的起始索引。如果该字符不是数字,但是之前已经开始了一串数字,那么函数会从输入字符串中提取出该串数字,去掉它的前导 0,并把得到的整数添加到一个 Set 对象中。这样做能确保只有不同的整数被添加到 Set 中。最后,函数会返回 Set 的大小,也就是说输入字符串中包含的不同整数的数量。

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/*
* @lc app=leetcode.cn id=1805 lang=javascript
*
* [1805] 字符串中不同整数的数目
*/

// @lc code=start
/**
* @param {string} word
* @return {number}
*/
var numDifferentIntegers = function (word) {
word = word + "$";
const reg = /[0-9]/;
let set = new Set(),
start,
flag = false;
for (let i = 0; i < word.length; i++) {
const char = word[i];
if (reg.test(char) && !flag) {
start = i;
flag = true;
} else if (!reg.test(char) && flag) {
let num = word.slice(start, i);
while (num.length > 1 && num[0] === "0") {
num = num.slice(1);
}
set.add(num);
flag = false;
}
}
return set.size;
};
// @lc code=end