这也是一道题解挺精彩的题
题目链接
public class FlipDigital {
/*
dp-易
https://leetcode-cn.com/problems/reverse-bits-lcci/
给定一个32位整数 num,你可以将一个数位从0变为1。请编写一个程序,找出你能够获得的最长的一串1的长度。
*/
// 测试
public static int reverseBits(int num) {
int max = 0;
int reverse = 0;
int current = 0;
for (int i = 0; i < 32; i ++) {
if ((num&1) == 1) {
current ++;
reverse ++;
} else {
reverse = current + 1;
current = 0;
}
if (reverse > max) max = reverse;
num >>= 1;
}
return max;
}
public static void main(String[] args) {
int input = 23;
int res = reverseBits(input);
System.out.println(res);
}
}
精彩在哪里呢,有如下几点:
- 通过&1操作,判断低位二进制数为0为1
- 同时通过for 循环限制在32次以内
- 每次计算好之后通过>>1右移一位
- 接下来上一张图(第一行是一个数的二进制表示,第二行是current序列)
如图,得到明显1的个数
- 逻辑解释就是:
- 遇到1,current += 1
然后开始将0变换为1操作 - 遇到0,则将reverse = current + 1,这时候current = 0
- 接下来就是分两种情况
- 遇到1:reverse +1,同时current + 1
- 遇到0:reverse = current + 1,同时 current = 0
- 这题解将数组给省略了,只存储了要求的最大值
没了。规律就是这么个规律,找到规律,然后逻辑表示。
会发现,高级题就是逻辑题,高级之处在于看似脱离了题本身,实则是掌控住了规律,从一定高度来抽象脱离出问题的本质。