翻转数位00

题目链接

翻转数位

题目描述

注意点

  • 可以将一个数位从0变为1
  • 找出能够获得的最长的一串1的长度(必须是连续的)

解答思路

  • 参照题解使用动态规划解决本题,对于任意一个位置i,dp[i][0]表示到达且包含第i位不翻转0最长1的长度,dp[i][1]表示到达且包含第i位翻转一个数位0最长1的长度
  • 如果位置idx的数位是0,那么如果不翻转0,该位置dp[idx][0] = 0,如果翻转0,该位置dp[idx][1] = dp[idx - 1][0] + 1;如果位置i的数位是1,那么如果不翻转0,该位置dp[idx][0] = dp[idx - 1][0] + 1,如果翻转0,该位置dp[idx][1] = dp[idx - 1][1] + 1,观察规律可得,任意位置idx的dp值只与idx - 1位置有关,所以并不需要存储所有位置的dp值,只需要保存前一个位置的dp值并实时更新res的值即可

代码

java 复制代码
class Solution {
    public int reverseBits(int num) {
        int res = 0;
        // dp[i][0]表示到达且包含第i位不翻转0最长1的长度
        // dp[i][1]表示到达且包含第i位翻转一个数位0最长1的长度
        int[][] dp = new int[33][2];
        // int idx = 1;
        for (int idx = 1; idx <= 32; idx++) {
            if ((num & 1) == 1) {
                dp[idx][0] = dp[idx - 1][0] + 1;
                dp[idx][1] = dp[idx - 1][1] + 1;
            } else {
                dp[idx][0] = 0;
                dp[idx][1] = dp[idx - 1][0] + 1;
            }
            res = Math.max(res, Math.max(dp[idx][0], dp[idx][1]));
            num >>= 1;
        }
        return res;
    }
}

关键点

  • 动态规划的思想
  • 根据前一个位置的状态推出现在位置的状态
相关推荐
猿周LV6 分钟前
JMeter 安装及使用 [软件测试工具]
java·测试工具·jmeter·单元测试·压力测试
知来者逆8 分钟前
计算机视觉——速度与精度的完美结合的实时目标检测算法RF-DETR详解
图像处理·人工智能·深度学习·算法·目标检测·计算机视觉·rf-detr
晨集8 分钟前
Uni-App 多端电子合同开源项目介绍
java·spring boot·uni-app·电子合同
时间之城10 分钟前
笔记:记一次使用EasyExcel重写convertToExcelData方法无法读取@ExcelDictFormat注解的问题(已解决)
java·spring boot·笔记·spring·excel
阿让啊12 分钟前
C语言中操作字节的某一位
c语言·开发语言·数据结构·单片机·算法
এ᭄画画的北北13 分钟前
力扣-160.相交链表
算法·leetcode·链表
椰羊~王小美17 分钟前
LeetCode -- Flora -- edit 2025-04-25
java·开发语言
凯酱25 分钟前
MyBatis-Plus分页插件的使用
java·tomcat·mybatis
程序员总部35 分钟前
如何在IDEA中高效使用Test注解进行单元测试?
java·单元测试·intellij-idea
oioihoii38 分钟前
C++23中if consteval / if not consteval (P1938R3) 详解
java·数据库·c++23