问题描述
小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后,他希望统计在替换后剩下的整数中,不同整数的数目。
例如,给定字符串 "a123bc34d8ef34",替换后形成的字符串是 " 123 34 8 34",剩下的整数是 "123"、"34"、"8" 和 "34"。不同的整数有三个,即 "123"、"34" 和 "8"。
注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数。
题目理解
本题要求我们处理一个由数字和小写英文字母组成的字符串 word。我们需要将字符串中的非数字字符替换为空格,然后统计替换后剩下的整数中,不同整数的数目。特别需要注意的是,只有当两个整数的十进制表示(不含前导零)不同时,才认为它们是不同的整数。
数据结构选择
为了高效地存储和统计不同的整数,我们可以使用集合(set)。集合的一个主要特性是它可以自动去重,这对于统计不同整数的数目非常有帮助。
算法步骤
- 遍历字符串:逐个字符遍历输入的字符串
word。 - 提取数字:当遇到数字时,继续读取直到遇到非数字字符,形成一个完整的数字子串。
- 去除前导零:对于提取出的数字子串,去除前导零。如果去除前导零后字符串为空,则将其视为
"0"。 - 存储不同的数字:将去除前导零后的数字子串加入集合中。
- 返回结果:最后,返回集合的大小,即不同整数的数目。
`代码: def solution(word: str) -> int: # 用于存储不同的整数 unique_numbers = set()
# 遍历字符串
i = 0
while i < len(word):
# 如果当前字符是数字
if word[i].isdigit():
# 找到完整的数字子串
num_start = i
while i < len(word) and word[i].isdigit():
i += 1
num_str = word[num_start:i]
# 去除前导零
num_str = num_str.lstrip('0')
if num_str == '':
num_str = '0'
# 将去除前导零后的数字加入集合
unique_numbers.add(num_str)
else:
i += 1
# 返回集合的大小,即不同整数的数目
return len(unique_numbers)
if name == 'main': print(solution("a123bc34d8ef34") == 3) print(solution("t1234c23456") == 2) print(solution("a1b01c001d4") == 2)`