题目描述
描述:给定一个32位整数 num,你可以将一个数位从0变为1。请编写一个程序,找出你能够获得的最长的一串1的长度。
输入: num = 1775(110111011112)
输出: 8
输入: num = 7(01112)
输出: 4
解题思路
思路1:注意,题目描述要求为,给定一个整数num,其二进制位数为32位,你可以将该整数对应的二进制数中的一个0转换为1,求其所能得到的转换后的二进制位最长的1的长度。我们可以使用一个变量cur表示截止当前位置为止连续1的个数,其遇到0则归0反之遇到1则加1;使用一个变量insert表示将0转换为1后连续1的个数,注意,只能将一个0转换为1,故遇到1则其加1反之遇到0其则为cur加1;使用一个变量res表示insert的最大值。
int reverseBits(int num)
{
//保存insert的最大值
int res=0;
//当前位置为止连续1的个数遇到0归零遇到1加1
int cur=0;
//在当前位置变成1往前数连续1的最大个数遇到0变成cur+1遇到1加1
int insert=0;
//32位整数 从低位到高位
for(int i=0;i<32;i++)
{
//当前位为1
if(num&(1<<i))
{
cur++;
insert++;
}
else
{
insert=cur+1;
cur=0;
}
res=max(res,insert);
}
return res;
}
总结:由于只能将一个0转换为1,所以在存在多个0时,需要判断和计算转换哪个0能够得到的连续1的长度最长。cur表示截止目前为止连续1的个数,当当前为0,则insert=cur+1,表示将当前0变为1后再加上原来的连续1后的个数,此时再将cur置为0,表示后续重新计算连续1的长度,如果后面遇到1,insert继续在原来的基础上加1,反之又变成inser=cur+1,依次类推,每次使用一个res来记录最大的insert即可。