📌  相关文章
📜  1到n位数字,二进制表示形式中没有连续的1。(1)

📅  最后修改于: 2023-12-03 14:59:03.556000             🧑  作者: Mango

题目介绍

这道题要求我们在1到n位数字中,找出那些二进制表示形式不包含连续1的数字。这道题的本质是一个组合问题,需要通过计算出可行方案数来解决。

解题思路

要通过计算可行方案数来解决这个问题,我们可以采用动态规划的方式来进行求解。我们定义变量a和b,分别表示当前位为0和1时的可行方案数。具体来说,可以采用以下公式来进行求解:

  • a[i] = a[i-1] + b[i-1]
  • b[i] = a[i-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

总结

在解决这道题之前,我们需要对计算可行方案数的方法有所了解,也就是采用动态规划的方式来进行求解。通过计算可行方案数,我们可以得到最终的结果。在编写代码的过程中,我们需要充分按照公式的要求来进行实现,同时需要注意处理边界情况。