算法题:翻转数位
题目
给定一个32位整数 num
,你可以将一个数位从0变为1。请编写一个程序,找出你能够获得的最长的一串1的长度。
思路
为了找到最长的一串1的长度,我们需要找到中间只间隔一个’0’的两个’1’串,这样翻转中间这一个’0’就能把两个‘1‘串拼接在一起。 为此,我们可以用pre
,cur
两个变量来表示前后两个’1’串的长度。那么,在遍历过程中, pre + cur + 1
的最大值即为答案。
特殊情况:当有连续两个0时,如 “100111…”,当遍历到第二个0时,它左边相邻的’1’串的长度pre
为0.
另外,num == -1
的情况 需要特判。因为-1
的补码为全1.
Leetcode代码
class Solution {
public:
int reverseBits(int num) {
// -1 要特判
if (~num == 0) return 32;
int res = 0, cur = 0, pre = 0; //pre: 左侧与0相邻的'1'的长度
for (int bit = 31; bit >= 0; bit -- ) {
int t = num >> bit & 1;
if (t) cur ++ ;
else {
pre = cur;
cur = 0;
}
res = max(res, cur + pre + 1);
}
return res;
}
};