数字字符串中圆圈的数量计算| 豆包MarsCode AI刷题

130 阅读3分钟

数字字符串中圆圈数量的计算问题解析

在这道题目中,小I需要统计一串数字字符中包含的圆圈总数。不同数字包含的圆圈数量有明确的规则:0、6、9 各包含1个圆圈,8 包含2个圆圈,而其他数字如 1、2、3、4、5、7 则不包含任何圆圈。基于这些规则,我们需要设计一个算法快速计算任意输入字符串中圆圈的总数量。


问题拆解与解题思路

  1. 规则映射
    数字与圆圈数量的关系是固定的,因此可以通过一个映射结构(如字典)直接记录每个数字对应的圆圈数量。例如:

    • 0, 6, 9 -> 1
    • 8 -> 2
    • 其他数字如 1, 2, 3, 4, 5, 7 -> 0

    使用字典可以使得查询圆圈数量的时间复杂度为 (O(1)),这是解决问题的核心优化。

  2. 字符串遍历
    对输入字符串逐个字符进行遍历,利用字典查找每个数字对应的圆圈数量,并将这些数量累加。字符串的遍历复杂度为 (O(n)),其中 (n) 是字符串长度。

  3. 输出结果
    遍历完成后,直接输出累加得到的圆圈总数。


代码实现

以下是完整的代码实现:

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)

复杂度分析

  1. 时间复杂度
    遍历字符串的时间复杂度为 (O(n)),其中 (n) 是字符串长度。字典查找的复杂度为 (O(1)),因此整体时间复杂度为 (O(n))。

  2. 空间复杂度
    使用了一个固定大小的字典来存储数字与圆圈数量的映射,因此空间复杂度为 (O(1))。


解题思考

  1. 可扩展性
    如果将来需要处理包含其他符号或字符的字符串,我们可以轻松扩展字典以支持新的规则。例如,可以为英文字母或特殊字符添加新的圆圈计数。

  2. 输入限制与边界处理

    • 空字符串:当输入为空时,直接返回结果 0
    • 非法字符:题目默认输入是数字字符,但在实际应用中可能会包含其他非数字字符。为了增强鲁棒性,可以在遍历前添加检查,忽略非数字字符或抛出异常。
  3. 优化空间
    该算法已经较为优化,但可以进一步改进,例如利用数组替代字典存储圆圈数量映射,避免查表的字典开销。此外,如果输入字符串特别长,可能需要优化内存占用。


总结

这道题目表面上看是简单的字符串遍历,但结合字典查表的方式可以进一步优化效率。通过明确规则映射、有效处理字符串遍历,最终实现了一个时间复杂度为 (O(n))、空间复杂度为 (O(1)) 的高效解决方案。更进一步,通过优化输入处理和拓展规则映射,代码可以具备更高的实用性和适应性。