数字字符串中圆圈数量的计算问题解析
在这道题目中,小I需要统计一串数字字符中包含的圆圈总数。不同数字包含的圆圈数量有明确的规则:0、6、9 各包含1个圆圈,8 包含2个圆圈,而其他数字如 1、2、3、4、5、7 则不包含任何圆圈。基于这些规则,我们需要设计一个算法快速计算任意输入字符串中圆圈的总数量。
问题拆解与解题思路
-
规则映射
数字与圆圈数量的关系是固定的,因此可以通过一个映射结构(如字典)直接记录每个数字对应的圆圈数量。例如:0, 6, 9 -> 18 -> 2- 其他数字如
1, 2, 3, 4, 5, 7 -> 0
使用字典可以使得查询圆圈数量的时间复杂度为 (O(1)),这是解决问题的核心优化。
-
字符串遍历
对输入字符串逐个字符进行遍历,利用字典查找每个数字对应的圆圈数量,并将这些数量累加。字符串的遍历复杂度为 (O(n)),其中 (n) 是字符串长度。 -
输出结果
遍历完成后,直接输出累加得到的圆圈总数。
代码实现
以下是完整的代码实现:
def solution(s: str) -> int:
# 定义每个数字对应的圆圈数
circle_count = {
'0': 1,
'6': 1,
'9': 1,
'8': 2,
'1': 0,
'2': 0,
'3': 0,
'4': 0,
'5': 0,
'7': 0
}
# 计算总圆圈数
total_circles = sum(circle_count[char] for char in s)
return total_circles
# 测试代码
if __name__ == '__main__':
print(solution(s="1234567890") == 5)
print(solution(s="8690") == 5)
print(solution(s="1111") == 0)
复杂度分析
-
时间复杂度
遍历字符串的时间复杂度为 (O(n)),其中 (n) 是字符串长度。字典查找的复杂度为 (O(1)),因此整体时间复杂度为 (O(n))。 -
空间复杂度
使用了一个固定大小的字典来存储数字与圆圈数量的映射,因此空间复杂度为 (O(1))。
解题思考
-
可扩展性
如果将来需要处理包含其他符号或字符的字符串,我们可以轻松扩展字典以支持新的规则。例如,可以为英文字母或特殊字符添加新的圆圈计数。 -
输入限制与边界处理
- 空字符串:当输入为空时,直接返回结果
0。 - 非法字符:题目默认输入是数字字符,但在实际应用中可能会包含其他非数字字符。为了增强鲁棒性,可以在遍历前添加检查,忽略非数字字符或抛出异常。
- 空字符串:当输入为空时,直接返回结果
-
优化空间
该算法已经较为优化,但可以进一步改进,例如利用数组替代字典存储圆圈数量映射,避免查表的字典开销。此外,如果输入字符串特别长,可能需要优化内存占用。
总结
这道题目表面上看是简单的字符串遍历,但结合字典查表的方式可以进一步优化效率。通过明确规则映射、有效处理字符串遍历,最终实现了一个时间复杂度为 (O(n))、空间复杂度为 (O(1)) 的高效解决方案。更进一步,通过优化输入处理和拓展规则映射,代码可以具备更高的实用性和适应性。