AI刷题笔记03
题目描述:疯狂整数的统计
小C发现了一类特殊的整数,他称之为"疯狂整数"。 疯狂整数是指只包含数字'1'和'2’的整数。举个例子,数字 1、2和121都是疯狂整数。现在,给定一个整数 N,你的任务是计算出所有小于或等于N的非负疯狂整数的数量。
样例
输入:N=21,输出:5;输入N=50,输出:6;输入N=5,输出:2
题目理解
疯狂整数:从最低数位到最高数位(从个位,十位,百位....)都是1或者2的整数
解题核心思路
对于小于或等于N的非负疯狂整数的统计算法
解题步骤
问题分析
- 疯狂整数是只包含数字1和2的整数。例如,1、2、11、12、21、22等都属于疯狂整数。
- 任务是给定一个整数N,计算出所有小于或等于N的疯狂整数的数量。
解题思路
- 疯狂整数的定义:疯狂整数仅由数字1和2组成,因此它们的十进制表示只能使用这两个数字。比如1、2、11、12、21、22等。
- 逐步生成:从1开始,我们可以使用递归或者迭代的方法来生成所有的疯狂整数。每生成一个疯狂整数,我们就检查它是否小于或等于N,如果是的话就计数。
- 终止条件:当生成的疯狂整数大于N时,我们可以停止生成,因为后面的疯狂整数都会更大。
算法设计
- 递归生成:可以通过递归的方法生成疯狂整数。在每一步中,我们可以选择在当前数字后面加上'1'或'2',直到生成的数字大于N。
- 限制:我们生成的数字要限制在小于等于N的范围内。
核心理解
- 通俗理解:从1,2,11,12,21,22,111,112,121,122.....到无穷穷尽为止,可将其看作是从1,2开始变化,例如,11=1 * 10+1,12=2* 10 +2,21=2* 10 +1,......,111=11* 10 +1, 112=11* 10 +2,121=12* 10 +1,122=12* 10 +2.....从中可以看出由1,2得到11,12,21,22后,再以此为基础通过乘以10的方法将其位数提前一位,而后在其后面加上1或2,构成新的疯狂整数。
代码编写
def solution(N):
# 用于存储结果的计数器
count = 0
# 递归生成疯狂整数
def generate(num):
nonlocal count
# 如果当前生成的数字大于N,就不继续递归
if num > N:
return
# 当前生成的数字小于等于N时,计数
if num > 0:
count += 1
# 递归生成下一个数字,分别加上1和2
generate(num * 10 + 1)
generate(num * 10 + 2)
# 从1开始递归生成疯狂整数
generate(0)
return count
函数解释
递归函数 generate(num) :
num是当前生成的数字。- 如果
num > N,我们直接返回,避免生成过大的数字。 - 如果
num > 0(确保不包括0),就计数,因为这是一个有效的疯狂整数。 - 递归地生成下一个数字,可以在当前数字后加上1或者2。通过
num * 10 + 1和num * 10 + 2来生成下一个数字。
补充说明
若对于函数代码的概念不清楚,可使用一些AI程序寻求解释,AI刷题的高效性与便利性就体现在这里。