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

关键点

  • 动态规划的思想
  • 根据前一个位置的状态推出现在位置的状态
相关推荐
meiying883821 分钟前
多快递公司快递单号批量查询接口怎么对接?Python 聚合查询实现
java·大数据·python
古法安卓26 分钟前
Android-GPU压测工具
android·java·android studio
D e re k ZH29 分钟前
C++ 并发、未定义行为与工程化难点(No 3)
数据结构·c++·算法·面试
SL_staff1 小时前
10人团队如何用轻量私有化文档平台实现知识复用提效?技术视角拆解B/S架构下的协作闭环
java·开源·全栈
释厄6231 小时前
同性线套娃律——圆面积必然=1+2+...+n 的求和·圆心不与 π 相关
java·人工智能·算法·1024程序员节
暴力求解2 小时前
C++ ---继承(二)
开发语言·c++·算法
猫猫.1532 小时前
IO、存储、硬盘、文件系统详细总结
java·java-ee
SL_staff2 小时前
设备离线时业务不中断:JVS-IOT高可用架构解析
java·物联网·产品
码林拾遗WJ2 小时前
告警分级的自动化实测:模型判断 vs 人工拍板
人工智能·算法·自动化
郭小李2 小时前
mybatis 动态 sql
java·sql·mybatis