问题描述
小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后,他希望统计在替换后剩下的整数中,不同整数的数目。
例如,给定字符串 "a123bc34d8ef34",替换后形成的字符串是 " 123 34 8 34",剩下的整数是 "123"、"34"、"8" 和 "34"。不同的整数有三个,即 "123"、"34" 和 "8"。
注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数。
解题思路
- 替换非数字字符:遍历字符串,将所有非数字字符替换为空格。
- 提取整数:将替换后的字符串按空格分割,提取出所有的整数。
- 去除前导零:对每个整数去除前导零。
- 去重:将去除前导零后的整数去重,并统计不同整数的数量。
代码详解
def solution(word: str) -> int:
# 替换非数字字符
word_with_spaces = ''.join(' ' if not char.isdigit() else char for char in word)
# 按空格分割,提取出一个列表
integers = word_with_spaces.split()
# 去零
cleaned_integers = [int(num) for num in integers]
# set() 将列表转换为集合,自动去除重复的整数
unique_integers = set(cleaned_integers)
return len(unique_integers)
- 首先,使用列表推导式遍历字符串中的每个字符,如果字符是数字则保留,否则替换为空格。
''.join(...)将列表中的字符重新组合成一个字符串。 - 使用
split()方法将字符串按空格分割,得到一个包含所有整数的列表。 - 使用
int(num)将每个字符串形式的整数转换为整数类型,自动去除前导零。 - 使用
set()将列表转换为集合,自动去除重复的整数。最后返回集合的长度,即不同整数的数量。
总结
- 掌握如何使用列表推导式和
join方法来处理字符串中的字符。 - 学会使用
split方法按特定字符分割字符串。 - 理解字符串到整数的转换,以及如何利用整数类型自动去除前导零。
- 了解集合
set的去重功能,并能将其应用于统计不同元素的数量。