学习方法与心得1——结合完美整数题 | 豆包MarsCode AI刷题

34 阅读3分钟

问题描述

一个整数如果由相同的数字构成,则称为完美整数。例如:

  • 111333 是完美整数。
  • 1219101 是不完美整数。

现在,你需要计算给定区间 [x, y] 中有多少个整数是完美整数。

代码实现

def solution(x, y):
    # 生成所有位数的完美整数
    def generate_perfect_numbers(max_len):
        perfect_numbers = []
        for digit in range(1, 10):  # 每一位的数字可以是 1 到 9
            for length in range(1, max_len + 1):  # 生成从 1 位到 max_len 位
                perfect_number = int(str(digit) * length)
                perfect_numbers.append(perfect_number)
        return perfect_numbers

# 获取区间 [x, y] 的完美整数
max_len = len(str(y))  # 区间最大数的位数
perfect_numbers = generate_perfect_numbers(max_len)
count = sum(1 for num in perfect_numbers if x <= num <= y)
return count

if __name__ == "__main__":
    # 测试样例
    print(solution(1, 10) == 9)  # [1, 2, ..., 9] 都是完美整数
    print(solution(2, 22) == 10)  # [2, 3, ..., 9, 11, 22] 共 10 个

一、题目解析

1. 完美整数定义

完美整数是所有位数相同的整数,例如 1、22、333。数字构成简单,但分布离散。对于任意区间 [x, y],需要快速筛选出这些离散分布的数字。

2. 算法思路

生成法替代遍历法:

  • 普通方法是遍历区间内所有数字,检查是否符合条件。但效率低下。
  • 改进后,直接生成所有可能的完美整数,然后判断哪些在 [x, y] 区间内。

生成完美整数:

  • 数字位数范围为 1 到 len(str(y)),每一位填充相同的数字。
  • 生成形式为:digit * length,其中 digit 是 1~9,length 是位数。

二、知识总结

  1. 问题特点分析
  • 问题的核心是如何高效筛选符合特定特性的数字。
  • 对于离散分布的目标数字,通过生成法直接获取目标比逐一遍历更高效。
  1. Python技巧
  • 字符串操作:
    • 使用 str(n) 和 int(s) 实现数字与字符串的转换,便于构造重复数字。
    • str(digit) * length 生成重复数字。
  • 列表推导式:
    • 用 sum(1 for num in perfect_numbers if x <= num <= y) 快速统计满足条件的数字。
  • 函数分解:
    • 把生成逻辑封装为独立函数 generate_perfect_numbers,保持代码清晰。

三、学习建议

  1. 解题流程
  • 阅读题目: 理解关键特性(如完美整数的定义)和约束条件(如区间大小)。
  • 设计思路: 明确解题方法(遍历 or 生成),分析时间复杂度。
  • 实现代码: 用简单结构实现,先确保正确性再优化性能。
  • 测试与调试: 设计多种边界测试样例,验证代码稳定性。
  1. 刷题方法建议
  • 题目分层:从简单题入手,逐步挑战复杂题型(如动态规划、图论)。
  • 多角度思考:一题多解,比较不同方法的优缺点,理解问题本质。
  • 总结复盘:每完成一道题后,记录解决思路和优化点,便于后续回顾。

四、将AI与学习资源结合

  • 辅助理解: 当题目描述复杂时,使用 AI 解释关键点,理清解题思路。
  • 代码优化: 在自己完成初始代码后,利用 AI 提供的改进建议,学习更高效的实现方式
  • 实时反馈: AI 可以模拟测试样例,帮助快速发现问题。

五、总结

通过 AI 提供的辅助功能与系统化学习计划的结合,能够显著提高刷题效率,掌握多种问题的解决方法。