求最大连续bit数

求最大连续bit数

描述
求一个int类型数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1
本题含有多组样例输入。
数据范围:数据组数:1<=t<=5,
进阶:时间复杂度:O(log2n),空间复杂度:O(1)
输入描述:
输入一个int类型数字

输出描述:
输出转成二进制之后连续1的个数

示例1
输入:
3
5
200

输出:
2
1
2

说明:
3的二进制表示是11,最多有2个连续的1。
5的二进制表示是101,最多只有1个连续的1。

方法一:(利用bitset)

#include<iostream>
#include<bitset>
using namespace std;
 
int main(){
    int N;
    while(cin>>N){
        bitset<64> a(N);
        int maxlen=0;
        for(int i=0;i<64;++i){
            if(a[i]==1){
                int count=0;
                while(i<64 && a[i]==1){
                    ++i; ++count;
                }
                maxlen=max(maxlen,count);
            }
        }
        cout<<maxlen<<endl;
    }
    return 0;
}

复杂度分析:

时间复杂度:
O(log2n)
空间复杂度:
O(1),常数空间

方法二:连除法

具体做法:

将十进制转换成二进制的方法可以用连除取余法,那我们不断连除2,每次都取余2得到最后一位的二进制数,然后检查该二进制数是否为1,如果是1则统计计数,如果不为1说明连续中断了,比较获取最大值,并更新统计计数为0.

#include<iostream>
using namespace std;

int main(){
    int n;
    while(cin >> n){
        int count = 0; //记录每次统计的连续1的个数
        int max_count = 0; //记录最大连续1的个数
        while(n){
            if(n % 2 == 1) //最后一位为1
                count++;
            else{ //遇到不为1
                max_count = max(max_count, count); //更新最大值
                count = 0; //从0开始
            }
            n /= 2; //去掉最后一位
        }
        max_count = max(max_count, count); //最后一次更新最大值
        cout << max_count << endl;
    }
    return 0;
}

复杂度分析:

时间复杂度:
O(log2n)连除取余一共log2n次
空间复杂度:
O(1),无额外空间

方法三:位运算

具体做法:
当一个数和自己左移一位进行位与运算,相当于和自己错开一位进行的位与运算,如果有连续的1,经过错位位与之后会少一个1,如果没有连续的1,错位位与之后就是0。那么我们可以通过这种不断与自己的左移一位位与,直到为0,什么时候结束就说明最大有多少连续的1。

在这里插入图片描述

#include<iostream>
using namespace std;

int main(){
    int N;
    while(cin>>N){
        int count=0;
        for(;N!=0;++count){
            N &= N>>1;
        }
        cout<<count<<endl;
    }
    return 0;
}

复杂度分析:

时间复杂度:
O(log2n)平均复杂度低于上述方法一,因为不用遍历0位的情况,但是最坏复杂度还是O(log2n)
空间复杂度:
O(1),无额外空间

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值