题目
给定一个32位整数 num,你可以将一个数位从0变为1。请编写一个程序,找出你能够获得的最长的一串1的长度。
示例
输入: num = 1775(110111011112)
输出: 8
输入: num = 7(01112)
输出: 4
提前知道的概念
位运算
n & (1 << i)
首先:1 << i的含义是将i左移i位,如
1<<2 则0001->0100
那么n & (1 << i)就是计算n的第i位(从右数)
解法、动态规划
思想
因为题目说明是32位的整数,那么即使一位一位的计算也可行
设置三个变量iCurrent 、iMax 、res
其中当第i位为1时, iCurrent ++;
当为0时,iMax = iCurrent+1,并将iCurrent置零
在这一步的操作的含义是
(1)当遇到1,则当前串的长度加1
(2)当遇到0时,将保存的长度加1,并将长度归零
最后保存最大的长度
class Solution {
public int reverseBits(int num) {
int iCurrent = 0;
int iMax = 0;
int res = 1;
for(int i = 0; i < 32; i++)
{
if((num & (1 << i)) != 0)
{
iCurrent++;
iMax++;
}
else
{
iMax = iCurrent + 1;
iCurrent = 0;
}
res = Math.max(iMax,res);
}
return res;
}
}
大家如果有好的想法可以在评论区一起讨论