链接: link
题目
描述
求一个int类型数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1
数据范围:数据组数:1≤t≤5 ,1≤n≤500000
进阶:时间复杂度:O(logn)\O(logn) ,空间复杂度:O(1)\O(1)
输入描述:
输入一个int类型数字
输出描述:
输出转成二进制之后连续1的个数
示例1
输入:
200
输出:
2
说明:
200的二进制表示是11001000,最多有2个连续的1。
思路
求最大连续bit位,也就是将它的每一位和1进行按位与,定义一个count用来记录连续1的次数,定义一个max_count用来保存当前最大连续1的个数。
解题步骤
法一
让输入的数字n不断的右移并与1进行按位与(&),直到n的值为0,如果n&1的结果为1,则count++,否则将count则为0,并且每次判断两个计数间的大小
代码如下
#include <iostream>
using namespace std;
int main() {
int n;
while(cin>>n)
{
int count = 0,max_count = 0;
while(n)
{
if(n & 1)
{
count++;
max_count = max(count,max_count);
}
else
{
count = 0;
}
n = n >> 1;
}
cout<<max_count<<endl;
}
}
这类方法在oj题中是可以过的,结果如下
但是也有特例,比如说当它输入的值为-1时,结果如下:
原因在于数字右移,高位补符号位,而-1在机器中存储的二进制代码全为1,所以为了解决这种方法也就有了方法二
法二
步骤和法一差不多,只不过这次是将1进行左移依次去和n上的每一位进行比较,其代码如下
#include <iostream>
using namespace std;
int main() {
int n;
while(cin>>n)
{
int count = 0,max_count = 0;
for(int i = 0;i < 32;i++)
{
if(n & (1<<i))
{
count++;
max_count = max(count,max_count);
}
else
{
count = 0;
}
}
cout<<max_count<<endl;
}
}