0%

面试题 05.03. 翻转数位

面试题 05.03. 翻转数位

一个dp问题(我又菜起来了)

curSum记录当前遇到的连续的1。 curSumF记录翻转过后最长的连续1。

遇到0

​ curSum置0。

​ curSumF置为curSum+1,表示连接了前面一段。

遇到1

​ curSum和curSumF都加1。

因为curSum始终记录这前面一段连续1,所以设置为curSum+1后,如果后面还连续,就会自动更新连接这两段,如果后面为1,那就会清空为仅翻转当前位。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public:
int reverseBits(int num) {
int curSum = 0;
int curSumF = 0;
int ret = 0;
int i = 0;
while(i++ < 32)
{
if(num & 1)
{
++curSum;
++curSumF;
}else
{
curSumF = curSum + 1;
curSum = 0;
}
num >>= 1; // 这里用右移,例如2147483647左移不让移
ret = max(ret, curSumF);
}
return ret;
}
};

类似滑动窗口