问题描述
一个整数如果由相同的数字构成,则称为完美整数。例如:
1、11、333是完美整数。12、19、101是不完美整数。
现在,你需要计算给定区间 [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 是位数。
二、知识总结
- 问题特点分析
- 问题的核心是如何高效筛选符合特定特性的数字。
- 对于离散分布的目标数字,通过生成法直接获取目标比逐一遍历更高效。
- Python技巧
- 字符串操作:
- 使用 str(n) 和 int(s) 实现数字与字符串的转换,便于构造重复数字。
- str(digit) * length 生成重复数字。
- 列表推导式:
- 用 sum(1 for num in perfect_numbers if x <= num <= y) 快速统计满足条件的数字。
- 函数分解:
- 把生成逻辑封装为独立函数 generate_perfect_numbers,保持代码清晰。
三、学习建议
- 解题流程
- 阅读题目: 理解关键特性(如完美整数的定义)和约束条件(如区间大小)。
- 设计思路: 明确解题方法(遍历 or 生成),分析时间复杂度。
- 实现代码: 用简单结构实现,先确保正确性再优化性能。
- 测试与调试: 设计多种边界测试样例,验证代码稳定性。
- 刷题方法建议
- 题目分层:从简单题入手,逐步挑战复杂题型(如动态规划、图论)。
- 多角度思考:一题多解,比较不同方法的优缺点,理解问题本质。
- 总结复盘:每完成一道题后,记录解决思路和优化点,便于后续回顾。
四、将AI与学习资源结合
- 辅助理解: 当题目描述复杂时,使用 AI 解释关键点,理清解题思路。
- 代码优化: 在自己完成初始代码后,利用 AI 提供的改进建议,学习更高效的实现方式
- 实时反馈: AI 可以模拟测试样例,帮助快速发现问题。
五、总结
通过 AI 提供的辅助功能与系统化学习计划的结合,能够显著提高刷题效率,掌握多种问题的解决方法。