题解:统计字符串中不同整数的数量
问题描述
小R有一个字符串 word,由数字和小写英文字母组成。他希望统计在字符串中出现的不同整数的数量。在统计之前,需要按照以下规则处理字符串:
- 用空格替换掉所有的非数字字符。
- 提取出字符串中连续的数字作为整数。
- 如果两个整数的不含前导零的十进制表示相同,则认为它们是相同的整数。
例如:
- 给定字符串
"a123bc34d8ef34",处理后得到整数序列:123、34、8、34,去重后有 3 个不同的整数:123、34和8。 - 字符串
"a1b01c001d4"中,整数序列为:1、01、001和4。由于01和001与1的十进制表示相同,因此只有两个不同整数:1和4。
解题思路
-
字符串处理:
- 遍历字符串,将所有非数字字符替换为空格,方便分割出连续数字部分。
-
提取整数:
- 使用字符串分割方法(
split())将处理后的字符串分割为一个列表,提取其中的数字子串。
- 使用字符串分割方法(
-
去除前导零:
- 将每个数字子串转换为整数类型(
int),自然会去除前导零。
- 将每个数字子串转换为整数类型(
-
去重统计:
- 使用集合(
set)存储所有的整数,集合的特性会自动去重。
- 使用集合(
-
返回结果:
- 返回集合中元素的数量,即不同整数的数量。
代码实现
以下是基于上述思路的 Python 实现:
def solution(word: str) -> int:
# 1. 替换非数字字符为空格
processed = ''.join(' ' if not char.isdigit() else char for char in word)
# 2. 分割字符串提取所有数字子串
numbers = processed.split()
# 3. 转换为整数集合,自动去除前导零和重复项
unique_numbers = set(int(num) for num in numbers)
# 4. 返回集合大小
return len(unique_numbers)
# 测试样例
if __name__ == '__main__':
assert solution("a123bc34d8ef34") == 3
assert solution("t1234c23456") == 2
assert solution("a1b01c001d4") == 2
assert solution("abc") == 0
assert solution("0000") == 1
测试样例
-
样例1:
solution("a123bc34d8ef34")-
处理步骤:
- 替换非数字字符后:
" 123 34 8 34" - 提取数字子串:
["123", "34", "8", "34"] - 去除前导零并去重:
{123, 34, 8}
- 替换非数字字符后:
-
输出:
3
-
-
样例2:
solution("t1234c23456")-
处理步骤:
- 替换非数字字符后:
" 1234 23456" - 提取数字子串:
["1234", "23456"] - 去除前导零并去重:
{1234, 23456}
- 替换非数字字符后:
-
输出:
2
-
-
样例3:
solution("a1b01c001d4")-
处理步骤:
- 替换非数字字符后:
" 1 01 001 4" - 提取数字子串:
["1", "01", "001", "4"] - 去除前导零并去重:
{1, 4}
- 替换非数字字符后:
-
输出:
2
-
总结
-
高效去重:使用集合来去重,简化了逻辑,实现了对不同整数的快速统计。
-
前导零处理:通过转换为整数类型(
int),自然去除前导零,避免了手动处理。 -
复杂度分析:
- 时间复杂度:O(n)O(n),其中 nn 是字符串的长度(处理替换和分割操作);
- 空间复杂度:O(k)O(k),其中 kk 是提取出的数字子串数量。
-
适用性:代码简洁、逻辑清晰,适用于各种包含数字和字符的字符串。