给一个数n,找出有多少个不大于n的正数,且这些正数的二进制表示中不包含两个连续的1
int转2进制string的API!!
先用dp找出在k位二进制长度的数有多少满足条件的。a[i]表示以0为结尾的长度为i + 1的满足条件的数字个数,b[i]表示1为结尾的。
再找a[n - 1] + b[n - 1]里面多计算了多少,只有当 num 连续两位为0时,b[i]由于第 i 位置是1所以是overcount的。11、01、10都能cover到a[i]和b[i]
public class Solution {
public int findIntegers(int num) {
StringBuilder sb = new StringBuilder(Integer.toBinaryString(num)).reverse();
int n = sb.length();
int[] a = new int[n];
int[] b = new int[n];
a[0] = 1;
b[0] = 1;
for (int i = 1; i < n; i++) {
a[i] = a[i - 1] + b[i - 1];
b[i] = a[i - 1];
}
int res = a[n - 1] + b[n - 1];
for (int i = n - 2; i >= 0; i--) {
if (sb.charAt(i) == '0' && sb.charAt(i + 1) == '0') {
res -= b[i];
}
if (sb.charAt(i) == '1' && sb.charAt(i + 1) == '1') {
break;
}
}
return res;
}
}