翻转数位~

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

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

思路:滑动窗口

首先通过位运算将原数字从低位到高位取出来。接着定义三个变量,分别是滑动窗口的左右边界滑动窗口中第一个0之后的位置next。当遇到取出的数字是0时,计算窗口长度,对答案进行更新,并将下一个窗口的起点设置为next即可。
对于第一个0,可以通过一个标志位flag来特殊处理,跳过上述操作。
这里因为有负数和0的存在,一定要遍历完所有的32位数。

class Solution {
public:
    int reverseBits(int num) {
        int ans = 0;
        bool flag = false;
        int l = 0,r = 0;
        int next = 0;
        while(r<32){
             if((num&1) == 0){
                if(!flag) {
                    next = r+1;
                    flag = true;
                }
                else{
                    ans = max(r-l,ans);
                    l = next;
                    next = r+1;
                }
            }
            ++r;
            num = num>>1;
        }
        return max(r-l,ans);
    }
};

题目解析:
拿1101110111举例
从右往左,第一个0,此时
r =4(++r),next = 4(next = r+1),r = 4(++r),num右移一位
从右往左,第二个0,此时
r = 8(++r),ans = 7-0=7,l = 4,next = 8,r = 8
从右往左,第三个0,此时
r = 11(++r),ans = 10 - 4 = 6,l = 8,r = 11
从右往左,第四个0,此时
r = 12(++r),ans = 11 - 8 = 2,l = 9,r = 12
……后面ans越来越小,固定为2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值