问题描述
小R有一个字符串 word,该字符串由数字和小写字母组成。小R希望将每个非数字字符替换为空格,并统计替换后剩下的整数中不同整数的数目。
例如:
给定字符串 "a123bc34d8ef34",替换后的字符串为 " 123 34 8 34"。其中,不同的整数有 "123"、"34" 和 "8",因此不同整数的数量是 3。
注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数。
思路解析
1. 输入格式和要求
- 输入: 一个字符串
word,包含数字和小写字母。 - 输出: 统计替换后的字符串中的不同整数的个数。
2. 关键操作
- 替换操作: 将所有非数字字符替换为空格。
- 提取整数: 利用正则表达式从字符串中提取所有的整数。
- 去重操作: 使用集合(set)去重,确保统计的整数是唯一的。
3. 解决步骤
- 替换非数字字符:
- 对字符串中的每个字符进行判断,将非数字字符替换为空格。
- 提取整数:
- 使用正则表达式
\b\d+\b提取字符串中的整数部分。\b表示单词边界,\d+表示一个或多个数字字符。
- 使用正则表达式
- 去重并统计:
- 将提取出的整数转换为整型并存入集合中,集合自动去重。
- 最后,返回集合的大小,即不同整数的数量。
4. 关键点
- 前导零处理: 例如
01和1是相同的整数,因此在提取时应该忽略前导零。 - 整数不重复计数: 将整数转换为
int类型,可以去掉前导零并正确比较不同整数。
代码实现
import re
def solution(word: str) -> int:
# Step 1: Replace non-digit characters with spaces
word = ''.join(' ' if not char.isdigit() else char for char in word)
# Step 2: Extract all integers using regex
# 使用正则表达式提取所有整数,并确保不含前导零
integers = re.findall(r'\b\d+\b', word)
# Step 3: Use a set to store unique integers
unique_integers = set(int(num) for num in integers)
# Step 4: Return the count of unique integers
return len(unique_integers)
if __name__ == '__main__':
# 测试用例
print(solution("a123bc34d8ef34") == 3) # 测试样例1
print(solution("t1234c23456") == 2) # 测试样例2
print(solution("a1b01c001d4") == 2) # 测试样例3
print(solution("a123bc34d8ef34")) # 输出3
代码解释
Step 1: 替换非数字字符
word = ''.join(' ' if not char.isdigit() else char for char in word)
- 使用列表推导式遍历字符串中的每个字符,判断是否是数字字符。如果是数字字符,则保留该字符,否则将其替换为空格。最终通过
join()方法将这些字符连接成新的字符串。
Step 2: 提取整数
integers = re.findall(r'\b\d+\b', word)
- 使用正则表达式
\b\d+\b提取整数。\b确保我们提取的是单独的整数,而不是被字母连接的数字。\d+匹配一个或多个连续的数字字符。
Step 3: 去重并转换为整数
unique_integers = set(int(num) for num in integers)
- 使用集合(set)存储提取出的整数,集合的特性是自动去重。通过
int(num)将每个数字字符串转换为整数,确保去除前导零。
Step 4: 返回不同整数的数量
return len(unique_integers)
- 返回集合的大小,即不同整数的数量。
测试用例分析
测试用例1
输入:
word = "a123bc34d8ef34"
步骤:
- 替换非数字字符后得到字符串:
" 123 34 8 34"。 - 提取整数:
["123", "34", "8", "34"]。 - 去重后的整数:
{"123", "34", "8"}。 - 最终输出:
3。
输出: 3
测试用例2
输入:
word = "t1234c23456"
步骤:
- 替换非数字字符后得到字符串:
" 1234 23456"。 - 提取整数:
["1234", "23456"]。 - 去重后的整数:
{"1234", "23456"}。 - 最终输出:
2。
输出: 2
测试用例3
输入:
word = "a1b01c001d4"
步骤:
- 替换非数字字符后得到字符串:
" 1 01 001 4"。 - 提取整数:
["1", "01", "001", "4"]。 - 去重后的整数:
{"1", "4"}(注意01和001被视为1)。 - 最终输出:
2。
输出: 2
总结与学习建议
总结
- 字符串处理与正则表达式:
通过使用正则表达式有效地提取数字部分,并且利用集合去重来保证结果的准确性。 - 前导零处理:
使用int类型转换自动去除前导零,避免了手动处理。 - 空间与时间效率:
代码实现高效,利用集合去重和正则表达式提取数字的方式,使得问题得以迅速解决。
学习建议
- 深入理解正则表达式:
正则表达式是处理字符串匹配和提取的强大工具,掌握常见的正则表达式模式对于字符串处理问题非常有帮助。 - 集合与去重:
集合是解决去重问题的高效工具,理解集合的特性,能够帮助我们解决许多实际问题。 - 边界情况的处理:
在处理数字和字符串时,特别要注意边界条件,比如前导零等特殊情况。 - 加强算法分析能力:
在处理类似问题时,考虑到时间和空间复杂度,优化算法是提高解决效率的关键。