疯狂整数的统计| 豆包MarsCode AI刷题

54 阅读2分钟

题目分析

在本题中,我们被引入了一个新颖的整数概念——“疯狂整数”。疯狂整数是指仅由数字'1'和'2'组成的整数。例如,1、2和121都属于疯狂整数的范畴。任务是给定一个整数N,计算出所有小于或等于N的非负疯狂整数的数量。

问题思考

要解决这个问题,我们需要生成所有可能的疯狂整数,并检查它们是否小于或等于给定的N。这个问题的难点在于如何高效地生成所有可能的疯狂整数,同时避免超出N的范围。

思路改进

我们可以通过递归的方式生成所有可能的疯狂整数。从空字符串开始,逐步添加'1'或'2',直到生成的数字超过N或者达到N的长度限制。

代码编写

以下是使用Python编写的代码实现:

def solution(N: int) -> int:
    crazy_numbers = []

    def generate_crazy_numbers(current):
        # 如果当前数字不为空且小于等于 N,则添加到列表中
        if current and int(current) <= N:
            crazy_numbers.append(int(current))
        
        # 递归生成下一个数字
        if len(current) < len(str(N)):  # 限制生成的长度
            generate_crazy_numbers(current + '1')
            generate_crazy_numbers(current + '2')

    # 从空字符串开始生成
    generate_crazy_numbers('')
    
    # 返回疯狂整数的数量
    return len(crazy_numbers)

if __name__ == '__main__':
    print(solution(N = 21) == 5)
    print(solution(N = 50) == 6)
    print(solution(N = 5) == 2)

难点分析

  • 递归的终止条件:当当前生成的数字超过N或者达到N的长度时,应该停止递归。
  • 数字的转换:在将字符串形式的数字添加到列表之前,需要将其转换为整数形式。
  • 性能考虑:由于递归生成疯狂整数的方式可能会产生大量的中间字符串,因此需要考虑代码的执行效率。

性能考量

在设计测试样例时,我们还考虑了算法的性能。样例1和样例3提供了对算法在处理较小数据集时的性能评估,而样例2则考察了算法在处理较大数据集时的效率。通过这些测试样例,我们可以确保算法在不同规模的数据集上都能保持良好的性能。

总结

通过递归的方法,我们可以有效地生成并计数所有小于或等于给定N的疯狂整数。这种方法虽然简单,但在处理大N时可能会遇到性能瓶颈。未来可以考虑使用动态规划或其他优化算法来提高效率。