题目:
小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后,他希望统计在替换后剩下的整数中,不同整数的数目。注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数。
例如,给定字符串 "a123bc34d8ef34",替换后形成的字符串是 " 123 34 8 34",剩下的整数是 "123"、"34"、"8" 和 "34"。不同的整数有三个,即 "123"、"34" 和 "8"。
解题思路:
- 字符串处理:我们需要遍历字符串 word,并将所有非数字字符替换为空格。
- 提取整数:将替换后的字符串按空格分割,提取出所有的整数。
- 去除前导零:将每个整数转换为整型(int),这样可以自动去除前导零。
- 去重:使用集合来存储这些整数,以确保我们只统计不同的整数。
- 返回结果:返回集合的大小,即不同整数的数目。
详细步骤:
1.替换非数字字符:
遍历字符串中的每个字符。如果字符是数字,保留它;否则,将其替换为空格。使用 ''.join() 方法将处理后的字符拼接成一个新的字符串。
word = ''.join(' ' if not char.isdigit() else char for char in word)
2.提取整数:
使用 split() 方法将处理后的字符串按空格分割,得到一个包含所有整数的列表。
numbers = word.split()
3.去除前导零并去重:
使用集合来存储整数,自动去重。将每个整数转换为整型(int),这样可以自动去除前导零。
unique_numbers = set(int(num) for num in numbers)
4.返回结果:
返回集合的大小,即不同整数的数目。
return len(unique_numbers)
具体代码:
def solution(word: str) -> int:
# 1. 将所有非数字字符替换为空格
word = ''.join(' ' if not char.isdigit() else char for char in word)
# 2. 按空格分割字符串,提取出所有的整数
numbers = word.split()
# 3. 将每个整数转换为整型,去除前导零,并使用集合来存储不同的整数
unique_numbers = set(int(num) for num in numbers)
# 4. 返回集合的大小,即不同整数的数目
return len(unique_numbers)
if __name__ == '__main__':
print(solution("a123bc34d8ef34") == 3)
print(solution("t1234c23456") == 2)
print(solution("a1b01c001d4") == 2)
知识点
1. 字符串处理
- 使用
for循环遍历字符串中的每个字符。使用isdigit()方法判断字符是否为数字。 使用''.join()方法将处理后的字符拼接成一个新的字符串。
2. 列表操作
- 使用列表推导式简化代码,生成新的列表。使用
split()方法将字符串按空格分割,得到一个包含所有整数的列表。
3. 集合操作
- 使用集合(
set)来存储整数,这可以实现自动去重。使用len()方法获取集合的大小,即不同整数的数目。
4. 类型转换
- 使用
int()方法将字符串转换为整数,自动去除前导零。