leet-code/src/main/java/leetcode/editor/cn/NonNegativeIntegersWithoutConsecutiveOnes.java
2021-09-11 22:48:41 +08:00

59 lines
1.6 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//给定一个正整数 n找出小于或等于 n 的非负整数中,其二进制表示不包含 连续的1 的个数。
//
// 示例 1:
//
// 输入: 5
//输出: 5
//解释:
//下面是带有相应二进制表示的非负整数<= 5
//0 : 0
//1 : 1
//2 : 10
//3 : 11
//4 : 100
//5 : 101
//其中只有整数3违反规则有两个连续的1其他5个满足规则。
//
// 说明: 1 <= n <= 10⁹
// Related Topics 动态规划 👍 226 👎 0
package leetcode.editor.cn;
//600:不含连续1的非负整数
class NonNegativeIntegersWithoutConsecutiveOnes {
public static void main(String[] args) {
//测试代码
Solution solution = new NonNegativeIntegersWithoutConsecutiveOnes().new Solution();
}
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public int findIntegers(int n) {
int[] dp = new int[31];
dp[0] = dp[1] = 1;
for (int i = 2; i < 31; ++i) {
dp[i] = dp[i - 1] + dp[i - 2];
}
int pre = 0, res = 0;
for (int i = 29; i >= 0; --i) {
int val = 1 << i;
if ((n & val) != 0) {
res += dp[i + 1];
if (pre == 1) {
break;
}
pre = 1;
} else {
pre = 0;
}
if (i == 0) {
++res;
}
}
return res;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}