问题描述
小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后,他希望统计在替换后剩下的整数中,不同整数的数目。
例如,给定字符串 "a123bc34d8ef34",替换后形成的字符串是 " 123 34 8 34",剩下的整数是 "123"、"34"、"8" 和 "34"。不同的整数有三个,即 "123"、"34" 和 "8"。
注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数
问题理解
- 输入:一个由数字和小写英文字母组成的字符串
word。 - 目标:统计替换后剩下的整数中,不同整数的数目。
- 替换规则:用空格替换每一个不是数字的字符。
- 整数识别:只有当两个整数的十进制表示不同(不含前导零),才认为它们是不同的整数。
解题思路
-
字符串处理:
- 遍历字符串
word,将非数字字符替换为空格。 - 使用正则表达式或字符串操作来提取出所有数字子串。
- 遍历字符串
-
整数提取:
- 提取出的数字子串可能包含前导零,需要去除前导零。
- 使用集合(
set)来存储不同的整数,因为集合会自动去重。
-
统计不同整数:
- 将处理后的整数添加到集合中。
- 集合的大小即为不同整数的数目。
数据结构选择
- 集合(
set) :用于存储不同的整数,自动去重。
算法步骤
- 使用正则表达式或字符串操作将非数字字符替换为空格。
- 提取出所有数字子串。
- 去除每个数字子串的前导零。
- 将处理后的整数添加到集合中。
- 返回集合的大小。
代码
import re
def solution(word: str) -> int:
# 提取所有数字子串
digits = re.findall(r'\d+', word)
# 创建一个集合来存储不同的整数
unique_integers = set()
# 遍历所有提取出的数字子串
for digit in digits:
# 将数字子串转换为整数并添加到集合中
unique_integers.add(int(digit))
# 返回集合的大小
return len(unique_integers)
if __name__ == '__main__':
print(solution("a123bc34d8ef34") == 3)
print(solution("t1234c23456") == 2)
print(solution("a1b01c001d4") == 2)
代码解析
- 使用正则表达式提取数字子串,我们可以使用
re.findall()函数来提取字符串中所有符合正则表达式的子串。对于数字子串,我们可以使用正则表达式\d+,它表示一个或多个数字 - 使用
int()函数去除前导零int()函数可以将字符串转换为整数,并且在转换过程中会自动去除前导零。例如,int("00123")会返回123 - 将数字子串转换为整数并添加到集合中,我们可以遍历提取出的数字子串,使用
int()函数将其转换为整数,并添加到集合中。集合会自动去重,因此我们最终得到的集合大小就是不同整数的数目。