翻转数位00

题目链接

翻转数位

题目描述

注意点

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

解答思路

  • 参照题解使用动态规划解决本题,对于任意一个位置i,dpi0表示到达且包含第i位不翻转0最长1的长度,dpi1表示到达且包含第i位翻转一个数位0最长1的长度
  • 如果位置idx的数位是0,那么如果不翻转0,该位置dpidx0 = 0,如果翻转0,该位置dpidx1 = dpidx - 10 + 1;如果位置i的数位是1,那么如果不翻转0,该位置dpidx0 = dpidx - 10 + 1,如果翻转0,该位置dpidx1 = dpidx - 11 + 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;
    }
}

关键点

  • 动态规划的思想
  • 根据前一个位置的状态推出现在位置的状态
相关推荐
垆边人似月.几秒前
华为机试题 :最大数
c++·算法·华为
高级程序源2 分钟前
springboot大学生体测系统72170-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·django·课程设计
IT研究室9 分钟前
最新计算机毕业设计选题推荐-基于spring boot的文学名著分享系统-网站-文档指导-Java-springboot
java·spring boot·课程设计
denlaku12 分钟前
JDK 13 新特性详解
java·开发语言
秋饼12 分钟前
Java 后端企业级 LLM 网关实战:Spring Cloud Gateway 构建统一大模型接入层
java·ai·技术分享·后端开发
今年下半年21 分钟前
【防重放】Spring Boot 通过自定义注解实现接口防重放
java·spring boot·自定义注解·防重放
念越24 分钟前
题库、练习与错题本代码阅读
开发语言·数据结构
WeiXin_DZbishe25 分钟前
基于Node.js的马拉松赛事管理系统的设计与实现-计算机毕设 附源码【课程设计】90211
java·javascript·vue.js·python·php·课程设计
zhenaibo52130 分钟前
如何与导师有效沟通选题?
算法
熊猫钓鱼>_>35 分钟前
大学图论第 6 讲:网络流与二分图匹配——对偶性让瓶颈自己现形
开发语言·算法·面试·职场和发展·图论·校招·面经