题目链接
翻转数位
题目描述
注意点
- 可以将一个数位从0变为1
- 找出能够获得的最长的一串1的长度(必须是连续的)
解答思路
- 参照题解使用动态规划解决本题,对于任意一个位置i,dp[i][0]表示到达且包含第i位不翻转0最长1的长度,dp[i][1]表示到达且包含第i位翻转一个数位0最长1的长度
- 如果位置idx的数位是0,那么如果不翻转0,该位置dp[idx][0] = 0,如果翻转0,该位置dp[idx][1] = dp[idx - 1][0] + 1;如果位置i的数位是1,那么如果不翻转0,该位置dp[idx][0] = dp[idx - 1][0] + 1,如果翻转0,该位置dp[idx][1] = dp[idx - 1][1] + 1,观察规律可得,任意位置idx的dp值只与idx - 1位置有关,所以并不需要存储所有位置的dp值,只需要保存前一个位置的dp值并实时更新res的值即可
代码
class Solution {
public int reverseBits(int num) {
int res = 0;
// dp[i][0]表示到达且包含第i位不翻转0最长1的长度
// dp[i][1]表示到达且包含第i位翻转一个数位0最长1的长度
int[][] dp = new int[33][2];
// int idx = 1;
for (int idx = 1; idx <= 32; idx++) {
if ((num & 1) == 1) {
dp[idx][0] = dp[idx - 1][0] + 1;
dp[idx][1] = dp[idx - 1][1] + 1;
} else {
dp[idx][0] = 0;
dp[idx][1] = dp[idx - 1][0] + 1;
}
res = Math.max(res, Math.max(dp[idx][0], dp[idx][1]));
num >>= 1;
}
return res;
}
}
关键点
- 动态规划的思想
- 根据前一个位置的状态推出现在位置的状态