LeetCode- 翻转数位

本文介绍了如何使用Python和Java算法解决一个面试题,给定一个32位整数,通过翻转数位来找到最长连续1的子串长度。算法核心是维护cur(当前连续1的计数),insert(当前位置变为1前的最长连续1计数),以及res(最终结果)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面试题.翻转数位

题目描述

给定一个32位整数 num,你可以将一个数位从0变为1。请编写一个程序,找出你能够获得的最长的一串1的长度。

输入: num = 1775(110111011112)
输出: 8

输入: num = 7(01112)
输出: 4

算法思路

每次维护三个变量:
cur:当前位置为止连续1的个数,遇到0归零,遇到1加1
insert:在当前位置变成1,往前数连续1的最大个数,遇到0变为cur+1,遇到1加1
res:保存insert的最大值即可.

Python

class Solution(object):
    def reverseBits(self, num):
        """
        :type num: int
        :rtype: int
        """
        cur = 0
        insert = 0
        res = 1
        for i in range(32):
            if num & (1<<i):
               cur += 1
               insert +=1
            else:
                insert = cur + 1
                cur = 0
            res = max(res,insert)
        return res

Java

class Solution {
    public int reverseBits(int num) {
        int cur = 0, insert = 0, res = 1;
        for (int i=0; i < 32; i++) {
             if ((num & 1) == 1) {
                cur++;
                insert++;
            } else {
                insert = cur+1;
                cur = 0;
            }
            res = Math.max(res, insert);
            num >>= 1;
        }
        return res;
    }
}

加油!

感谢!

努力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chaser&upper

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值