题目描述:
示例 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;
}
}