Given a positive integer n, find the number of non-negative integers less than or equal to n, whose binary representations do NOT contain consecutive ones.
Example 1:
Input: 5 Output: 5 Explanation: Here are the non-negative integers <= 5 with their corresponding binary representations: 0 : 0 1 : 1 2 : 10 3 : 11 4 : 100 5 : 101 Among them, only integer 3 disobeys the rule (two consecutive ones) and the other 5 satisfy the rule.
Note: 1 <= n <= 109
DP求解,参考回复中ofLucas网友的解答,程序如下所示:
class Solution {
public int findIntegers(int num) {
StringBuilder sb = new StringBuilder(Integer.toBinaryString(num)).reverse();
int n = sb.length();
int[] ones = new int[n];
int[] zeros = new int[n];
ones[0] = zeros[0] = 1;
for (int i = 1; i < n; ++ i){
zeros[i] = ones[i-1] + zeros[i-1];
ones[i] = zeros[i-1];
}
int res = zeros[n-1] + ones[n-1];
for (int i = n - 2; i >= 0; -- i){
if (sb.charAt(i) == '0' && sb.charAt(i+1) == '0'){
res -= ones[i];
}
else if (sb.charAt(i) == '1' && sb.charAt(i+1) == '1'){
break;
}
}
return res;
}
}