2022-02-21:不含连续1的非负整数。 给定一个正整数 n ,返回范围在 [0, n] 都非负整数中,其二进制表示不包含 连续的 1 的个数。 输入: n = 5 输出: 5 解释: 下面是带

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022-02-21:不含连续1的非负整数。 给定一个正整数 n ,返回范围在 [0, n] 都非负整数中,其二进制表示不包含 连续的 1 的个数。 输入: n = 5 输出: 5 解释: 下面是带相关的知识,希望对你有一定的参考价值。

2022-02-21:不含连续1的非负整数。
给定一个正整数 n ,返回范围在 [0, n] 都非负整数中,其二进制表示不包含 连续的 1 的个数。
输入: n = 5
输出: 5
解释:
下面是带有相应二进制表示的非负整数<= 5:
0 : 0
1 : 1
2 : 10
3 : 11
4 : 100
5 : 101
其中,只有整数3违反规则(有两个连续的1),其他5个满足规则。
1 <= n <= 10的9次方。
力扣600。

答案2022-02-21:

动态规划。
根据规律,跟斐波那契数列有关,但未找到这种解法。

代码用golang编写。代码如下:

package main

import "fmt"

func main() 
    n := 15
    ret := findIntegers(n)
    fmt.Println(ret)


func findIntegers(n int) int 
    i := 31
    for ; i >= 0; i-- 
        if (n & (1 << i)) != 0 
            break
        
    
    // for循环出来之后,i表示,n最高位的1,在哪?
    // 从这个位置,往右边低位上走!
    dp := make([][][]int, 2)
    for ii := 0; ii < 2; ii++ 
        dp[ii] = make([][]int, 2)
        for j := 0; j < 2; j++ 
            dp[ii][j] = make([]int, i+2)
        
    
    return f(0, 0, i, n, dp)


func f(pre, alreadyLess, index, num int, dp [][][]int) int 
    if index == -1 
        return 1
    
    if dp[pre][alreadyLess][index] != 0 
        return dp[pre][alreadyLess][index]
    
    ans := 0
    if pre == 1 
        ans = f(0, getMax(alreadyLess, twoSelectOne((num&(1<<index)) != 0, 1, 0)), index-1, num, dp)
     else 
        if (num&(1<<index)) == 0 && alreadyLess == 0 
            ans = f(0, alreadyLess, index-1, num, dp)
         else 
            ans = f(1, alreadyLess, index-1, num, dp) + f(0, getMax(alreadyLess, twoSelectOne((num&(1<<index)) != 0, 1, 0)), index-1, num, dp)
        
    
    dp[pre][alreadyLess][index] = ans
    return ans


func getMax(a, b int) int 
    if a > b 
        return a
     else 
        return b
    


func twoSelectOne(c bool, a, b int) int 
    if c 
        return a
     else 
        return b
    

执行结果如下:


左神java代码

以上是关于2022-02-21:不含连续1的非负整数。 给定一个正整数 n ,返回范围在 [0, n] 都非负整数中,其二进制表示不包含 连续的 1 的个数。 输入: n = 5 输出: 5 解释: 下面是带的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 68. 文本左右对齐 / 1894. 找到需要补充粉笔的学生编号 / 600. 不含连续1的非负整数(数位dp,好好学)

Leetcode——不含连续1的非负整数(数位DP,打家劫舍,理解不够深)

LeetCode 600 不含连续1的非负整数[字典数 动态规划] HERODING的LeetCode之路

Leetcode 600.不包含连续1的非负整数

java 给定未排序的非负整数数组,找到一个连续的子数组,它会增加给定的数字。

不连续1的非负整数--我只会无脑的数位dp