0
点赞
收藏
分享

微信扫一扫

不含连续1的非负整数

独孤凌雪 2021-09-21 阅读 60
今日算法
题目描述:
示例 1:
思路:

推荐直接lc看题解,,,没解出来。
f[i][j],i代表位数,j代表该位是0或者1,f[i][j]则代表第i位是j(0或者1)的合法数量有多少。

代码实现:
class Solution {
    static int N = 50;
    static int[][] f = new int[N][2];
    static {
        f[1][0] = 1;
        f[1][1] = 2;
        for (int i = 1; i < N - 1; i++) {
            f[i + 1][0] = f[i][1];
            f[i + 1][1] = f[i][0] + f[i][1];
        }
    }
    public int getLen(int n) {
        for (int i = 31; i >= 0; i--) {
            if (((n >> i) & 1) == 1) return i;
        }
        return 0;
    }
    public int findIntegers(int n) {
        int len = getLen(n);
        int ans = 0;
        int prev = 0;
        for (int i = len; i >= 0; i--) {
            int cur = ((n >> i) & 1);
            if (cur == 1) ans += f[i + 1][0];
            if (prev == 1 && cur == 1) break;
            prev = cur;
            if (i == 0) ans++;
        }
        return ans;
    }
}
举报

相关推荐

0 条评论