翻转数位

题目描述

来源于 https://leetcode-cn.com/

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

示例 1:

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

示例 2:

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

解法:

统计前一段连续的 1 的个数,以及后一段连续 1 的个数,两者之和 + 1 就是翻转一个 0->1 后连续 1 的个数。

class Solution {
public:
    int reverseBits(int num) {
        if(num == -1) return 32;
        
        unsigned int n = num;
        int prev = 0, curr = 0;
        int ret = 0;

        while(n){
            if(n & 1){
                curr++;
            }else{
                prev = curr;
                curr = 0;
            }
            ret = max(prev + curr, ret);
            n = n >> 1;
        }
        return ret + 1;
    }
};