问题描述
小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后,他希望统计在替换后剩下的整数中,不同整数的数目。
例如,给定字符串 "a123bc34d8ef34",替换后形成的字符串是 " 123 34 8 34",剩下的整数是 "123"、"34"、"8" 和 "34"。不同的整数有三个,即 "123"、"34" 和 "8"。
注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数。
解题思路
这道题目要求我们处理一个字符串,其中包含数字和小写字母,并将其中的字母用空格替换,然后统计在替换后的字符串中,所有不同整数的个数。
对于这道题目,我首先考虑的是如何将非数字字符(字母)替换为空格,并提取出数字子串。接下来,我需要去除数字前的零,并且只统计不同的整数。最终,通过去重和去前导零,我们可以得出答案。
解题过程
1. 替换非数字字符为空格
首先,题目要求将字符串中的非数字字符替换为空格。我们可以通过遍历字符串的每个字符,检查是否为数字。如果是数字,就保留它;如果是字母或其他字符,就用空格替换。
2. 提取数字子串
接下来,我需要从替换后的字符串中提取出所有连续的数字子串。这里可以利用字符串的 split() 方法来完成。这个方法会自动根据空格将字符串分割成多个部分,返回一个数字子串的列表。
3. 去掉前导零
我们还需要注意,题目中提到数字的前导零应该被去除。因此,对于每个数字子串,我们可以使用 int() 函数将其转换为整数。int() 会自动处理前导零问题,将 "00123" 变成 "123"。这样,不同表示形式的数字就能统一成相同的数值。
4. 统计不同整数
由于我们只关心不同的整数,集合(set)是一个非常合适的工具。集合可以自动去重,因此我们将每个数字子串转换成整数后存入集合,最终集合的大小就代表了不同整数的个数。
详解
假设给定字符串是 "a123bc34d8ef34",我们可以按照以下步骤处理:
-
替换非数字字符:
- 原字符串:"a123bc34d8ef34"
- 替换后的字符串:" 123 34 8 34"
-
提取数字子串:
- 通过 split() 方法,我们可以得到数字子串的列表:['123', '34', '8', '34']
-
去掉前导零:
- 将这些子串转成整数后,得到 [123, 34, 8, 34]
-
统计不同整数:
- 使用集合去重,得到 {123, 34, 8},不同整数的个数是 3。
代码实现
def solution(word: str) -> int:
# 替换所有非数字字符为空格
word = ''.join(c if c.isdigit() else ' ' for c in word)
# 分割字符串,提取所有数字子串
numbers = word.split()
# 使用集合去重,去掉前导零
unique_numbers = set(int(num) for num in numbers)
# 返回不同整数的个数
return len(unique_numbers)
# 测试
print(solution("a123bc34d8ef34") == 3) # 3
print(solution("t1234c23456") == 2) # 2
print(solution("a1b01c001d4") == 2) # 2
知识总结
1. 字符串的操作
-
join():通过遍历字符串并对每个字符进行条件判断,我们可以灵活地构造新的字符串。这是 Python 中非常常见的字符串操作方法。
-
split():这个方法通过分隔符将字符串分割成多个子串。它非常适合在处理分隔符时使用,如空格、逗号等。
2. 集合的应用
-
集合(set):集合是一个非常常见的数据结构,它会自动去重,非常适合用来统计唯一值的个数。在本题中,我们通过集合来统计不同的整数。
-
去重:通过 set(int(num)),我们确保去除了数字前的零并去除了重复的数字。
3. 类型转换
- int():使用 int() 函数能够把字符串转换成整数,并自动去除字符串中的前导零。这对于我们来说是一个非常有用的技巧。
总结
这道题的难点在于如何巧妙地使用字符串操作和集合去重来解决问题。通过替换非数字字符、提取数字子串、去掉前导零、使用集合去重,我们能够快速而高效地得到结果。