要解决这个问题,首先需要明确每个数字所包含的圆圈数:
- 数字
0,6,9含有 1 个圆圈。 - 数字
8含有 2 个圆圈。 - 其他数字如
1,2,3,4,5,7不含有圆圈。
因此,问题的核心就是遍历给定的字符串,针对每个字符检查它对应的圆圈数,并累加起来。
下面是解决该问题的代码实现:
def solution(s: str) -> int:
# 创建一个字典,记录每个数字字符对应的圆圈数量
circle_count = {'0': 1, '6': 1, '8': 2, '9': 1}
# 初始化圆圈总数
total_circles = 0
# 遍历字符串中的每个字符
for char in s:
# 如果字符在字典中,则累加相应的圆圈数
if char in circle_count:
total_circles += circle_count[char]
return total_circles
# 测试用例
if __name__ == '__main__':
print(solution(s = "1234567890") == 5) # 数字0, 6, 8, 9, 各包含圆圈数分别为1, 1, 2, 1
print(solution(s = "8690") == 5) # 数字8含2个圆圈,6,9,0各含1个圆圈,总共5个圆圈
print(solution(s = "1111") == 0) # 没有任何数字含圆圈
解释:
-
circle_count字典:我们定义了一个字典circle_count来映射每个数字字符到其对应的圆圈数。字典中有以下键值对:'0': 1'6': 1'8': 2'9': 1
-
遍历字符串:我们遍历输入字符串
s中的每个字符,对于每个字符,检查它是否存在于字典circle_count中。如果存在,就将相应的圆圈数加到total_circles变量中。 -
返回结果:最后返回
total_circles,即字符串中所有数字所包含的圆圈总数。
示例解释:
-
对于字符串
"1234567890":1,2,3,4,5不包含任何圆圈。6,9,0各含 1 个圆圈。8含 2 个圆圈。- 总共有 1 + 1 + 1 + 2 = 5 个圆圈。
-
对于字符串
"8690":8含 2 个圆圈。6,9,0各含 1 个圆圈。- 总共有 2 + 1 + 1 + 1 = 5 个圆圈。
-
对于字符串
"1111":1不包含圆圈。- 所以总共有 0 个圆圈。
时间复杂度:
- 遍历字符串的每个字符,时间复杂度为 O(n),其中 n 是字符串的长度。
空间复杂度:
- 只使用了一个字典存储数字和圆圈数,所以空间复杂度为 O(1),因为字典的大小是固定的。
这个解决方案高效且易于理解。
总结:
这道题的本质是统计特定数字的数量,对于每个特定数字统计其圆圈数并累加。 使用字典作为映射,既简单又高效,可以快速查找数字对应的圆圈数。 通过遍历字符串,逐个处理字符,避免了不必要的重复计算。 由于只有少数数字有圆圈,使用字典可以极大地提高程序的可读性和执行效率。
虽然这道题的难度较低,但它的设计和思考过程对我们理解字典在实际编程中的应用非常有帮助。字典的查找时间是常数时间,适合解决类似于这种需要快速匹配并进行简单操作的题目。
在更复杂的场景下,类似的思路也可以应用到其他问题中,比如根据某些条件快速查找、更新或累加数据,字典的灵活性使得它成为了非常常见的数据结构。