给定一个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