首页 > 其他分享 >力扣每日一题2024.8.5

力扣每日一题2024.8.5

时间:2024-08-06 17:25:59浏览次数:16  
标签:binary 二进制 非负 2024.8 整数 力扣 int length 一题

600.不含连续1的非负整数(困难)

给定一个正整数 n ,请你统计在 [0, n] 范围的非负整数中,有多少个整数的二进制表示中不存在 连续的 1
示例 1:

输入: n = 5
输出: 5
解释:
下面列出范围在 [0, 5] 的非负整数与其对应的二进制表示:
0 : 0
1 : 1
2 : 10
3 : 11
4 : 100
5 : 101
其中,只有整数 3 违反规则(有两个连续的 1 ),其他 5 个满足规则。
示例 2:

输入: n = 1
输出: 2
示例 3:

输入: n = 2
输出: 3

提示:

1 <= n <= 109

思路:

刚开始便是想到了暴力破解,但是想想这是困难题,看了看数据范围果然不简单。之后只能考虑用数位dp的方法进行解决。具体思路便是:

  1. 将输入的整数 n 转换为二进制字符串 binary
  2. 初始化两个数组 a[]b[],长度为二进制字符串长度 length,并且初始化 a[0] = 1b[0] = 1
  3. 循环处理每一位,根据动态规划的状态转移方程计算 a[]b[] 数组的值:
    • 对于 a[i],如果当前位是 0,则 a[i] = a[i-1] + b[i-1]
    • 对于 b[i],如果当前位是 1,则 b[i] = a[i-1]
  4. 计算最终结果 result = a[length - 1] + b[length - 1],这是在整个二进制数范围内满足条件的非负整数的个数。
  5. 再次遍历二进制字符串,检查是否有连续的1,如果有连续的0(也就是连续的0不符合条件),则通过减去 b[length - i - 1] 的方式来调整最终结果。
  6. 返回最终计算得到的结果 result,即在给定范围内满足条件的非负整数的个数。

总体来说,该代码使用动态规划来解决问题,通过预先计算满足条件的非负整数个数并且在遍历二进制字符串时进行调整,最终得到在给定范围内满足条件的非负整数个数。

class Solution {
    public int findIntegers(int n) {
    String binary = Integer.toBinaryString(n); // 将 n 转换为二进制字符串 
    int length = binary.length();
    
    int[] a = new int[length];  // 表示在第 i 位为0时不包含连续1的数量
    int[] b = new int[length];  // 表示在第 i 位为1时不包含连续1的数量
    
    a[0] = 1;
    b[0] = 1;
    
    for (int i = 1; i < length; i++) {
        a[i] = a[i-1] + b[i-1];//计算在第 i 位为0时不包含连续1的数量,根据动态规划的规则,
        //当前位置为0时的数量等于上一位0和上一位1的数量之和。
        b[i] = a[i-1];//计算在第 i 位为1时不包含连续1的数量,当前位置为1时的数量等于上一位0时的数量。
    }
    
    int result = a[length - 1] + b[length - 1];//计算初始结果,即所有位数的情况下的满足条件的整数数量。
    
    for (int i = 1; i < length; i++) {
        if (binary.charAt(i) == '1' && binary.charAt(i - 1) == '1') {//如果当前位和前一位都是1,
        //则存在连续的1,跳出循环。
            break;
        }
        if (binary.charAt(i) == '0' && binary.charAt(i - 1) == '0') {
            result -= b[length - i - 1];
            //如果当前位和前一位都是0,则需要减去在这种情况下的数量,因为这样的情况不满足条件。
        }
    }
    
    return result;    
    }
}

标签:binary,二进制,非负,2024.8,整数,力扣,int,length,一题
From: https://blog.csdn.net/2301_80011650/article/details/140933358

相关文章

  • 2024.8.6 test
    以后不记录躺尸题了。B有\(n\)个序列对应\(n\)个人,每个序列长度为\(k_i\)。你可以花费\(a_{i,j}\)的时间把第\(i\)个人从\(j-1\)提升到\(j\)级。求前\(m\)个时刻,每个时刻里每个人级数的和的和最大值。\(\sumk\le2e6,m\in[10^{10},10^{11}],a\le3000\).注意......
  • leetcode力扣第29题:两数相除
    这题看似简单,实则一点也不难(不是),实则还是比较困难。最简单的做法是直接用减法,不停循环计数,最后统计减多少次能成。如果被除数是2^31-1或差不多大小的数,而除数是1差不多大小的数,那循环减法要执行的次数太多,一定会超时。所以一定要有更好的思路(1)通过二分法查找可能的商(2)对于......
  • day32【LeetCode力扣】541. 反转字符串 II
    day32【LeetCode力扣】541.反转字符串II1.题目描述给定一个字符串s和一个整数k,从字符串开头算起,每计数至2k个字符,就反转这2k字符中的前k个字符。如果剩余字符少于k个,则将剩余字符全部反转。如果剩余字符小于2k但大于或等于k个,则反转前k个字符,其余字符......
  • 【笔记】非传统题选讲 2024.8.5
    今天睡着了。发了只是为了完整性。[CF1672E]notepad.exe先二分得到总长度\(\suml_i+n-1\)记为\(w_1\),然后考虑其它行数\(h\),最优的情况只能是每一行都用换行顶替一个空格,此时面积为\(w_h\cdoth=w_1-h+1\),所以\(w_h=\left\lfloorw_1/h\right\rfloor\)为唯一可能更新答......
  • 学习笔记 韩顺平 零基础30天学会Java(2024.8.5)
    P460八大Wrapper类     黄色的父类是number,黑色的是自己独立的P461装箱和拆箱     手动装箱示例:                             intn1=100;                Intergerinterger=newInterger(n1);//......
  • 2024.8.5 test
    A你可以花费\(x^2\)的代价使\(A_i\)加上\(x\),\(x\ge0\),最后再加上代价为\(c\sum|A_i-A_{i-1}|\),问最小代价。\(n\le10^5\)。我们可以把序列分成若干“山峰”以及“山谷”,山峰是不会加的。考虑从山谷开始做,即每次取出最小值。设一开始处理\(A_i\),发现\(A_i\)最多是......
  • leetcode200. 岛屿数量C++题解,精美图例和流程图,一题带你弄懂图的dfs遍历算法
    leetcode200.岛屿数量给你一个由‘1’(陆地)和‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例1:输入:grid=[[“1”,“1”,“1”,......
  • 云原生周刊:Knative 1.15 版本发布|2024.8.5
    开源项目推荐helm-secretshelm-secrets是一个Helm插件,用于动态解密加密的Helm值文件。TofuControllerTofuController(以前称为WeaveTF-Controller)是Flux的一个控制器,用于以GitOps方式协调OpenTofu和Terraform资源。TracetestTracetest是一个使用OpenTelem......
  • 【动态规划】力扣918. 环形子数组的最大和
    给定一个长度为n的环形整数数组nums,返回nums的非空子数组的最大可能和。环形数组意味着数组的末端将会与开头相连呈环状。形式上,nums[i]的下一个元素是nums[(i+1)%n],nums[i]的前一个元素是nums[(i-1+n)%n]。子数组最多只能包含固定缓冲区nu......
  • 【每日一题】【DFS】【试除法求约数】【大剪枝】清楚姐姐跳格子 牛客周赛 Round 54 D
    牛客周赛Round54D题清楚姐姐跳格子题目背景牛客周赛Round54题目描述样例#1样例输入#1523154样例输出#12做题思路首先知道ai......