青训营X豆包MarsCode 技术训练营:AI刷题笔记-03 | 豆包MarsCode AI 刷题

32 阅读3分钟

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 + 1num * 10 + 2 来生成下一个数字。

补充说明

若对于函数代码的概念不清楚,可使用一些AI程序寻求解释,AI刷题的高效性与便利性就体现在这里。