一、问题概述
给定一个包含数字和小写字母的字符串 word,我们的目标是从中提取出所有不同的整数。提取过程中,所有非数字字符应当被忽略,并且所有提取出的数字需要去掉前导零。最终,我们需要统计出这些不同整数的个数。
二、问题解读
字符串 word 中包含了数字和字母,而我们关心的部分是其中的数字序列。数字序列可以被字母、符号等非数字字符分隔开。我们需要:
- 去掉字符串中的所有非数字字符。
- 提取出所有数字序列,并确保每个数字序列去掉了前导零。
- 统计去重后的数字序列数量。
例如,对于字符串 "a123bc34d8ef34",应该输出 3,因为在去除字母并去掉前导零后,提取出的不同整数是 123, 34, 和 8。
三、解题思路
要解决这个问题,我们可以将其分为以下几个步骤:
- 替换非数字字符:首先,我们需要将所有非数字字符(即字母或符号)替换为空格。这样可以将数字序列从字母和符号中分离出来,方便后续处理。
- 提取数字序列:通过分割字符串,获取到所有的数字序列。由于我们已将字母转换为空格,分割后的结果将只包含数字部分。
- 去除前导零:对于每个数字序列,我们需要去除其中的前导零。这里可以借助 Python 的
int()函数,int()会自动去除数字字符串中的前导零。 - 去重并计数:我们使用一个集合(
set)来存储这些数字。集合的特点是自动去除重复元素,因此它非常适合用来去重。 - 返回不同整数的数量:最后,我们只需要返回集合中的元素个数,即为不同整数的数量。
四、具体实现
1. 替换非数字字符
为了方便提取数字,我们可以使用正则表达式将所有非数字字符替换为空格。re.sub(r'\D', ' ', word) 可以完成这一操作,其中 \D 表示匹配所有非数字字符。
2. 分割数字部分
使用 split() 方法将替换后的字符串按空格分割成多个部分,每个部分即为一个可能的数字字符串。
3. 去除前导零
为了去除前导零,我们可以直接将每个数字字符串转换成整数。Python 中的 int() 函数会自动去除前导零。
4. 使用集合去重
为了确保每个数字只计数一次,我们将所有的整数放入一个集合中。集合自动去重,因此无需手动检查重复的数字。
5. 返回结果
最后,返回集合的大小,即为不同整数的数量。
五、代码实现
pythonCopy Code
import re
def num_different_integers(word: str) -> int:
# 使用正则表达式替换非数字字符为空格
word = re.sub(r'\D', ' ', word) # \D表示匹配任何非数字字符
# 分割字符串并去除空字符串
numbers = word.split()
# 使用集合去重,去除前导零
unique_numbers = set(int(num) for num in numbers)
# 返回不同整数的数量
return len(unique_numbers)
六、代码解析
-
替换非数字字符:
- 我们通过
re.sub(r'\D', ' ', word)将所有非数字字符替换为空格。r'\D'是正则表达式,表示匹配任意非数字字符。
- 我们通过
-
分割字符串:
- 使用
split()方法按空格将字符串分割成多个部分。每个部分代表一个数字字符串。注意,多个连续的空格会被忽略,因此我们得到的结果是一个包含所有数字的列表。
- 使用
-
去重并去除前导零:
- 通过
int(num)将每个数字字符串转换成整数,去除前导零。然后,我们将这些整数存储在集合unique_numbers中,集合会自动去重。
- 通过
-
返回不同整数的数量:
- 最后,返回集合
unique_numbers的大小,即为不同整数的数量。
- 最后,返回集合
七、复杂度分析
1. 时间复杂度
- 替换非数字字符:
re.sub()需要遍历整个字符串,因此时间复杂度为 O(n),其中 n 是字符串的长度。 - 分割字符串:
split()方法遍历整个字符串,时间复杂度也是 O(n)。 - 去重与转换为整数:遍历所有数字字符串并将其转换为整数,时间复杂度为 O(m),其中 m 是数字的数量。最大情况下,m 等于 n(字符串长度)。
- 因此,整体时间复杂度是 O(n)。
2. 空间复杂度
- 存储数字的集合需要 O(m) 空间,其中 m 是不同整数的数量。最大情况下,m 等于 n(每个数字都不同)。
- 替换操作会生成一个新的字符串,需要 O(n) 空间。
- 因此,整体空间复杂度是 O(n)。
八、测试用例
测试用例1:
pythonCopy Code
word = "a123bc34d8ef34"
print(num_different_integers(word)) # 输出 3
解析:去除字母后,得到数字 123, 34, 8, 其中 34 重复,因此不同整数为 3 个。
测试用例2:
pythonCopy Code
word = "t1234c23456"
print(num_different_integers(word)) # 输出 2
解析:去除字母后,得到数字 1234 和 23456,它们是不同的整数,因此输出 2。
测试用例3:
pythonCopy Code
word = "a1b01c001d4"
print(num_different_integers(word)) # 输出 2
解析:去除字母后,得到数字 1, 1, 1, 4,去除重复并去掉前导零后,不同的整数为 1 和 4,因此输出 2。
九、总结
本题的关键是如何处理和提取字符串中的数字,尤其是去除非数字字符、去除前导零以及去重。使用正则表达式和 Python 内置的集合功能,可以高效地解决这一问题。通过上述解法,我们能够在较短时间内获得准确的结果。