面试题 05.03. 翻转数位-----位运算

题目表述

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

示例:

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

位运算

双指针,利用与计算出num的0的位置,计算3个0间的位置差距,求出来最长序列即可。

class Solution {
    public int reverseBits(int num) {
        
        int res = 0;
        int count = 0;
        int left = 0;
        int pre = -1;
        int fast = 0;
        for(;fast < 32; fast++){
            int tmp = num & (1<<fast);
            if(tmp == 0){
                if(count == 0){
                    left = fast;
                     count++;
                    continue;
                }
                 
                res = Math.max(res, fast - pre -1);
                pre = left;
                left = fast;
                count++;
            }
        }
         res = Math.max(res, fast - pre -1);
        return res;
    }
}

class Solution {
    public int reverseBits(int num) {
        int cur = 0;
        int insert = 0;
        int res = 1;
        for(int i = 0; i < 32; i++){
            if((num & (1 << i)) != 0){
                cur += 1;
                insert += 1;
            }else{
                insert = cur + 1;
                cur = 0;
            }
            res = Math.max(res , insert);
        }
        return res;
    }
}
posted @ 2022-05-18 22:43  YoungerWb  阅读(32)  评论(0)    收藏  举报