题目的主要信息:

求int类型数字对应的二进制数字中最多有多少个连续的1。

方法一:

用count统计连续的1的个数,maxlen表示最大连续的个数。十进制数字除2取余,然后向右移动一位。余数如果是1则count++,比较当前count和maxlen的大小,更新maxlen的值;否则需要重新开始计数,count清零。

具体做法:

#include<iostream>
#include<string>
#include<vector>

using namespace std;

int main(){
    int n;
    while(cin>>n){
        int maxlen=0,count=0;
        while(n!=0){
            if(n%2==1) {
                count++;//连续的1个数加1
                if(count>maxlen){
                    maxlen = count;
                }
            }else{//重新开始计算连续的1的个数
                count=0;
            }
            n=n/2;//整个数字串向右移动一位
        }
        cout<<maxlen<<endl;
    }
    return 0;
}

复杂度分析:

  • 时间复杂度:O(log2n)O(log_2n),二进制数总共有log2nlog_2n位,每一位需要判断是否为1。
  • 空间复杂度:O(1)O(1),只用了常数空间。

方法二:

数n和左移一位的数n<<1进行位与运算:

  • 若有k位连续的1,相与之后不为0;
  • 若没有连续的1,相与之后位0;

当n经过多次运算变为0后,表示统计结束。 alt

具体做法:

#include<iostream>

using namespace std;

int main()
{
    int n;
    while(cin>>n)
    {
        int count=0;
        while(n!=0){//当n不为0时
            count++;
            n=n&(n<<1);//n与位移的n相与
        }
        cout<<count<<endl;
    }
    return 0;
}

复杂度分析:

  • 时间复杂度:O(log2n)O(log_2n),最坏情况下,所有位都为1,可以向左移动long2nlong_2n位。
  • 空间复杂度:O(1)O(1),只用了常数空间。