做题笔记:不同整数的计数问题
问题描述
小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后,他希望统计在替换后剩下的整数中,不同整数的数目。
例如,给定字符串 "a123bc34d8ef34",替换后形成的字符串是 " 123 34 8 34",剩下的整数是 "123"、"34"、"8" 和 "34"。不同的整数有三个,即 "123"、"34" 和 "8"。
注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数。
测试样例
样例1:
输入:
word = "a123bc34d8ef34"
输出:3
样例2:
输入:
word = "t1234c23456"
输出:2
样例3:
输入:
word = "a1b01c001d4"
输出:2
问题理解
我们需要处理一个由数字和小写英文字母组成的字符串,目标是统计替换非数字字符为空格后,剩下的不同整数的数量。
数据结构选择
- 字符串处理:我们需要遍历字符串,将非数字字符替换为空格。
- 分割字符串:将处理后的字符串按空格分割,得到所有整数。
- 去重:使用集合(
set)来存储不同的整数,因为集合会自动去重。
算法步骤
- 替换非数字字符:遍历字符串,将每个非数字字符替换为空格。
- 分割字符串:使用空格分割处理后的字符串,得到所有整数。
- 去重并转换为整数:将分割后的字符串转换为整数,并放入集合中。
- 统计不同整数的数量:集合的大小即为不同整数的数量。
关键点
- 去除前导零:在将字符串转换为整数时,Python 会自动去除前导零。
- 使用集合去重:集合可以自动去重,简化统计不同整数的过程。
代码框架
# 替换非数字字符为 空格
replaced_word = ''.join([' ' if not c.isdigit() else c for c in word])
# 按空格分割字符串
parts = replaced_word.split()
# 去除前导零并放入集合
unique_numbers = set(int(part) for part in parts)
# 返回不同整数的数量
return len(unique_numbers)
# 测试样例
test_cases = [
"a123bc34d8ef34",
"t1234c23456",
"a1b01c001d4"
]
for word in test_cases:
print(f"输入:{word}")
print(f"输出:{solution(word)}")
print()
关键步骤解释
- 替换非数字字符
replaced_word = ''.join([' ' if not c.isdigit() else c for c in word])
这行代码遍历字符串 word,将每个非数字字符替换为空格。
- 分割字符串:
parts = replaced_word.split()
使用空格分割处理后的字符串 replaced_word,得到所有整数。
- 去重并转换为整数
unique_numbers = set(int(part) for part in parts)
将分割后的字符串转换为整数,并放入集合 unique_numbers 中,集合会自动去重。
- 统计不同整数的数量
return len(unique_numbers)
返回集合 unique_numbers 的大小,即不同整数的数量。
实现代码
# 替换非数字字符为 空格
replaced_word = ''.join([' ' if not c.isdigit() else c for c in word])
# 按空格分割字符串
parts = replaced_word.split()
# 去除前导零并放入集合
unique_numbers = set(int(part) for part in parts)
# 返回不同整数的数量
return len(unique_numbers)
# 测试样例
test_cases = [
"a123bc34d8ef34",
"t1234c23456",
"a1b01c001d4"
]
for word in test_cases:
print(f"输入:{word}")
print(f"输出:{solution(word)}")
print()
总结与反思
这道题主要考察了以下几个编程和算法相关的考点:
1. 字符串处理
- 字符遍历与替换:通过遍历字符串,将非数字字符替换为空格。这需要对字符串的基本操作有深入的理解。
- 字符串分割:使用空格分割字符串,得到所有整数。这涉及到字符串的分割操作。
2. 数据结构的应用
- 集合(Set) :使用集合来存储不同的整数,集合的特性是自动去重,这简化了统计不同整数的过程。
- 列表(List) :在分割字符串后,得到的结果是一个列表,列表的遍历和操作也是常见的考点。
3. 类型转换
- 字符串到整数的转换:将分割后的字符串转换为整数,Python 的
int()函数会自动去除前导零,这简化了处理过程。
4. 算法思维
- 去重与统计:通过集合去重并统计不同整数的数量,这需要理解集合的特性以及如何利用集合来简化问题。
- 逻辑思维:如何将问题分解为多个步骤,并逐步解决,这需要良好的逻辑思维能力。
5. 代码实现与测试
- 函数封装:将问题封装为一个函数
solution,并通过测试样例来验证函数的正确性。 - 测试驱动开发:通过编写测试样例来驱动代码的开发和验证,这是一种常见的开发方法。
综合考察了字符串处理、数据结构的应用、类型转换、算法思维以及代码实现与测试等多个方面的知识点。解决这个问题可以锻炼和提升编程的基本技能和算法思维能力。