题目分析
在本题中,我们被引入了一个新颖的整数概念——“疯狂整数”。疯狂整数是指仅由数字'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时可能会遇到性能瓶颈。未来可以考虑使用动态规划或其他优化算法来提高效率。