问题描述
小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后,他希望统计在替换后剩下的整数中,不同整数的数目。
例如,给定字符串 "a123bc34d8ef34",替换后形成的字符串是 " 123 34 8 34",剩下的整数是 "123"、"34"、"8" 和 "34"。不同的整数有三个,即 "123"、"34" 和 "8"。
注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数。
测试样例
样例1:
输入:
word = "a123bc34d8ef34"
输出:3
样例2:
输入:
word = "t1234c23456"
输出:2
样例3:
输入:
word = "a1b01c001d4"
输出:2
解题:
def solution(word: str) -> int:
# 将非数字字符替换为空格
import re
s = re.sub(r'\D', ' ', word)
# 分割字符串,提取数字部分
nums = s.split()
# 使用集合存储不同的整数
unique_nums = set()
for num in nums:
# 去除前导零,如果结果为空,则表示数字是'0'
num = num.lstrip('0')
if num == '':
num = '0'
unique_nums.add(num)
# 返回不同整数的数量
return len(unique_nums)
这道题的要求是:
- 将字符串
word中的非数字字符替换为空格。 - 提取替换后字符串中的整数。
- 统计不同整数的数量,注意要忽略整数的前导零。
关键点:
- 前导零的处理: "01"、"001" 与 "1" 都表示相同的整数。
- 整数的提取: 需要准确地从字符串中分离出整数部分。
- 不同整数的统计: 使用合适的数据结构(如集合)来存储和比较。
解题思路
-
字符替换:
- 使用正则表达式,将字符串中的非数字字符替换为空格。
- 这样,原来的字母被空格替换,数字部分保留,方便后续处理。
-
提取整数:
- 将替换后的字符串按照空格分割,得到一个字符串列表,每个元素都是数字字符组成的字符串。
- 需要注意连续的数字会被保存在同一个字符串中。
-
处理前导零:
- 对于每个数字字符串,使用
lstrip('0')方法去除前导零。 - 如果去除后字符串为空,说明原来的数字是 "0",需要特殊处理,将其设为 "0"。
- 对于每个数字字符串,使用
-
统计不同的整数:
- 使用
set集合来存储处理后的数字字符串,自动去重。 - 最后返回集合的大小,即不同整数的数量。
- 使用
个人思考
在解这道题的过程中,需要注意以下几点:
-
边界条件与特殊情况:
- 处理前导零时,如果数字全是零,需要将其表示为
"0"。 - 防止去除前导零后得到空字符串的情况。
- 处理前导零时,如果数字全是零,需要将其表示为
-
数据结构的选择:
- 使用集合来存储不同的整数,自动去重,简化代码逻辑。
-
正则表达式的应用:
- 熟练使用正则表达式,可以简化字符串替换和匹配的操作。
-
字符串处理技巧:
- 使用内置方法如
lstrip()、split()来高效地处理字符串。
- 使用内置方法如
-
测试验证的重要性:
- 在编码完成后,使用样例进行验证,发现并纠正了代码中的错误。
-
拓展思考:
- 如果字符串中包含大写字母或其他特殊字符,是否需要额外处理?
- 如果需要统计整数的总和或其他统计信息,如何修改代码?
-
总结:
- 这道题考察了对字符串处理、正则表达式、集合等基础知识的掌握。
- 在处理实际问题时,细心和对边界情况的考虑是非常重要的。