📅  最后修改于: 2023-12-03 14:59:03.556000             🧑  作者: Mango
这道题要求我们在1到n位数字中,找出那些二进制表示形式不包含连续1的数字。这道题的本质是一个组合问题,需要通过计算出可行方案数来解决。
要通过计算可行方案数来解决这个问题,我们可以采用动态规划的方式来进行求解。我们定义变量a和b,分别表示当前位为0和1时的可行方案数。具体来说,可以采用以下公式来进行求解:
其中i表示当前的数字位数。这两个公式是如何得出的呢?我们可以这样来理解:对于a[i],首先可以从a[i-1]转移而来,即在当前数字的二进制表示形式的最高位添加一个0。另外,当前位为0时,可以由上一位的任意数字转移而来,因为0与任何数字相连都不会出现连续的1。对于b[i],首先可以从a[i-1]转移而来,即在当前数字的二进制表示形式的最高位添加一个1。另外,当前位为1时,由于不允许出现连续的1,所以只能由上一位的0转移而来。
最终的答案即为a[n]+b[n],其中n为数字的位数。
下面是采用Python语言实现的代码片段:
class Solution:
def findIntegers(self, n: int) -> int:
a, b, ans = 1, 1, 1
for i in range(2, n+1):
a, b = a+b, a
for i in '{:b}'.format(n):
if i == '1':
ans += a
a, b = b+a, a
return ans
在解决这道题之前,我们需要对计算可行方案数的方法有所了解,也就是采用动态规划的方式来进行求解。通过计算可行方案数,我们可以得到最终的结果。在编写代码的过程中,我们需要充分按照公式的要求来进行实现,同时需要注意处理边界情况。