问题描述
小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后,他希望统计在替换后剩下的整数中,不同整数的数目。
例如,给定字符串 "a123bc34d8ef34",替换后形成的字符串是 " 123 34 8 34",剩下的整数是 "123"、"34"、"8" 和 "34"。不同的整数有三个,即 "123"、"34" 和 "8"。
注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数。
代码实现
def solution(word: str) -> int:
import re
# 替换所有非数字字符为空格
replaced = re.sub(r'[^\d]', ' ', word)
# 分割字符串,提取所有的数字部分
numbers = replaced.split()
# 去掉前导零并将它们转换为集合以找到不同的整数
unique_numbers = {int(num) for num in numbers}
# 返回集合的长度
return len(unique_numbers)
if __name__ == '__main__':
print(solution("a123bc34d8ef34") == 3) # 示例1
print(solution("t1234c23456") == 2) # 示例2
print(solution("a1b01c001d4") == 2) # 示例3
一、题目解析
本题要求统计一个字符串中不同整数的数量。字符串包含字母和数字,通过以下步骤可以解决问题:
1、解题思路
- 替换非数字字符:将字符串中所有非数字字符替换为空格。这样可以提取出连续的数字块。
- 分割提取数字:使用字符串的 split() 方法将数字块分割出来,得到所有数字的列表。
- 去掉前导零并去重:将数字转换为整数以去掉前导零,并使用集合存储这些数字,集合天然去重。
- 统计集合大小:最后,集合的长度即为不同整数的个数。
2、示例分析
输入1:"a123bc34d8ef34"
- 替换后:" 123 34 8 34"
- 提取数字:["123", "34", "8", "34"]
- 去掉前导零并去重:{123, 34, 8}
- 集合长度:3
输入2:"a1b01c001d4"
- 替换后:" 1 01 001 4"
- 提取数字:["1", "01", "001", "4"]
- 去掉前导零并去重:{1, 4}
- 集合长度:2
二、知识总结
1、正则表达式的使用
- re.sub(r'[^\d]', ' ', word):将字符串中非数字字符替换为空格。
- 学习正则表达式的常见操作,如替换 (sub)、匹配 (match) 和提取 (findall)。
2、集合的去重特性
- 利用 Python 的集合 set 数据结构,可以快速去重。
- 在处理数字时,使用 int 转换可以自动去掉前导零。
3、字符串处理方法
- split() 方法将字符串按空格分割,是提取连续数字块的关键。
三、学习建议
对于入门学习者,掌握正则表达式和字符串操作是基础。建议通过多个练习熟悉 re 模块和集合操作,逐步提高对数据清理问题的解决能力。
总结建议
通过将 AI 刷题功能与传统学习资源结合,可以快速理解基础知识,同时通过复盘和优化不断提高代码能力。在学习过程中,注重知识的融会贯通,逐步掌握更多高效解题技巧。