题意
给一个数字,输出其二进制表示下最大连续1的个数
限制:数值不大于500000
方法
按二进制位查询
我们依次检验数值在二进制表示下的1位,2位,3位是否为1
也就是和1<<i
做与运算
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
while(~scanf("%d",&n)){
int m = 0; // 最大连续
int cur = 0; // 当前连续
for(int i = 0;i < 32;i++){ // 位
if(n & (1<<i)){ // 二进制与为1
cur++; // 当前+1
m = max(m,cur); // 更新最大连续长度
}else{ // 为0
cur = 0;
}
}
printf("%d\n",m);
}
return 0;
}
复杂度分析
时间复杂度: 与数值二进制表示长度相关,
空间复杂度: 只用了常数个数个变量,所以空间复杂度为
递降查询
每次查询末位,查询后把末位去掉,
以200为例
值 | 末位(二进制下) |
---|---|
200 | 0 |
200/2=100 | 0 |
100/2=50 | 0 |
50/2=25 | 1 |
25/2=12 | 0 |
12/2=6 | 0 |
6/2=3 | 1 |
3/2=1 | 1 |
1/2=0 | 0 |
所以最大连续的1的长度为2, 其实反过来看上面的序列也就是值的二进制从低位到高位
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
while(~scanf("%d",&n)){
int m = 0;
int cur = 0;
for(;n;n/=2){ // 每次去掉最后一位
if(n & 1){ // 判断最低位
cur++;
m = max(m,cur);
}else{
cur = 0;
}
}
printf("%d\n",m);
}
return 0;
}
复杂度分析
时间复杂度: 与数值二进制表示长度相关,
空间复杂度: 只用了常数个数个变量,所以空间复杂度为