翻转数位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;
    }
}

关键点

  • 动态规划的思想
  • 根据前一个位置的状态推出现在位置的状态
相关推荐
爬山算法3 分钟前
Maven(1)什么是Maven?
java·maven
计算机学姐7 分钟前
基于SpringBoot+Vue的旅游攻略平台管理系统
java·vue.js·spring boot·后端·intellij-idea·mybatis·旅游
EPSDA20 分钟前
Java中的Junit、类加载时机与机制、反射、注解及枚举
java·数据库·junit
是小李呀~22 分钟前
Java开发:文件上传和下载
java·开发语言
nvd1122 分钟前
Junit 5 - 理解Mockito,提高UT 覆盖率
java·junit
荔枝要好学40 分钟前
Java中和JavaScript中的var关键字
java·javascript
代码雕刻家41 分钟前
数据结构-3.5.队列的顺序实现
c语言·数据结构·算法
风禾万里43 分钟前
算法分类&自动驾驶主要算法介绍
算法
java—大象1 小时前
基于JavaWeb开发的Java+SpringMvc+vue+element实现驾校管理系统详细设计
java·前端·vue.js·spring boot·mybatis·课程设计
航行的土豆1 小时前
UE学习篇ContentExample解读-----------Blueprint_Mouse_Interaction
c++·学习·算法·游戏程序·虚幻引擎