题解 | #求最大连续bit数#
求最大连续bit数
https://www.nowcoder.com/practice/4b1658fd8ffb4217bc3b7e85a38cfaf2
求最大连续bit数
求最大连续bit数
/*
2022年09月21日 11:43:09
利用flag标记前一位是否为1
count统计的是当前区间内连续1的个数
每一次统计后存进vector中
当前位不是1的时候,count置0
最后输出vector最大的count
*/
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n;
cin >> n;
bool flag = false; // 标记当前bit位是1
int count = 0; // 统计连续的1
vector<int> v(32); // 记录当前最大的count
for(int i = 0; i < 32; ++i){
if(n & (1<<i)){ // 当前位是1
if(flag){ // 前一位也是1
++count;
v[i] = count;
}
else{
flag = true; // 标记当前位是1
count = 1;
v[i] = count;
}
}
else{ // 当前位不是1
flag = false;
count = 0;
v[i] = count;
}
}
int maxCount = 0;
for(auto e : v)
maxCount = max(maxCount, e);
cout << maxCount << endl;
return 0;
}
/*
2022年09月21日 11:43:09
模2除2就可以不断判断最后一位是否为1
统计连续的1个数
不为1的时候,连续1中断了,count重置为0
并更新maxCount
最后n判断完了再更新一次maxCount
时间复杂度O(logN)
空间复杂度O(1)
*/
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
int count = 0; // 统计连续1的个数
int maxCount = 0; // 最大连续1个数
while(n){
if(n%2 == 1) // 最后一位为1
++count;
else{
maxCount = max(count, maxCount);
count = 0;
}
n /= 2; // 去除最后一位
}
maxCount = max(count, maxCount);
cout << maxCount << endl;
return 0;
}
/*
2022年09月21日 11:43:09
位运算
一个数和自己左移一位进行位与运算,
相当于喝自己错开的一位进行与运算,
如果有连续的1,错位位与之后就少一个1,此时count++
如果没有连续的1,错位位与之后就是0,
时间复杂度O(logN)
空间复杂度O(1)
*/
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int count = 0;
while(n){
n &= n << 1;
++count;
}
cout << count << endl;
return 0;
}
补充:
如果想求一个数二进制位有几个1,用n与n-1与运算。n &= n-1;
查看6道真题和解析