HJ86 求最大连续bit数

知识点位运算

描述

对于给定的十进制整数 n,求解其二进制表示中,最长连续 1 段的长度。

输入描述:

输入一个十进制整数 n(1≦n≦5×10(5次幂))。

输出描述:

输出一个整数,表示 n 的二进制表示中,最长连续 1 段的长度。

示例1

输入:

复制代码
200

输出:

复制代码
2

说明:

复制代码
在这个样例中,十进制 (200)10 等于二进制 (11 001 000)2​,其中最长连续 1 段的长度为 2。

示例2

输入:

复制代码
1023

输出:

复制代码
10

说明:

复制代码
在这个样例中,十进制 (1023)10 等于二进制 (1 111 111 111)2​。

备注:

复制代码
本题数据已规范为单组询问(2025/01/15)。

cc方法00:

/hj086_bits_max_00_vio_00.cc

cpp 复制代码
// 暴力枚举
#include <iostream>
#include <vector>

using namespace std;

int GetMaxBit(int & n)
{
    int cntMax = 0;
    int count = 0;

    while (n) {
        if (n % 2) {
            count++;
            cntMax = max(cntMax, count);
        } else {
            count = 0;
        }
        n = n / 2;
    }

    return cntMax;
}

int main()
{
    int n = 0;
    while (cin >> n) {
        cout << GetMaxBit(n) << endl;
    }

    return 0;
}

cc方法01:

/hj086_bits_max_00_vio_01.cc

cpp 复制代码
// 暴力枚举
#include <iostream>
#include <vector>

using namespace std;

int GetMaxBit(int & n)
{
    int count = 0;
    for (; n != 0; count++) {
        // 只有当 `i` 位和 `i+1` 位同时为1时,结果位才为1
        // - 任何孤立的1(右侧是0)会被消除
        // 连续1序列的尾部每次右移异或后会被截断一个,同时count++,全部截掉后连续1的个数就是count计数
        n &= n << 1;
    }

    return count;
}

int main()
{
    int n = 0;
    while (cin >> n) {
        cout << GetMaxBit(n) << endl;
    }

    return 0;
}

cc方法02:

/hj086_bits_max_00_vio_02.cc

cpp 复制代码
// 暴力枚举
#include <iostream>
#include <vector>

using namespace std;

int GetMaxBit(int & n)
{
    int count = 0;
    int cntMax = 0;
    for (; n != 0; ) {
        if (n & 1) {
            count++;
            cntMax = max(cntMax, count);
        } else {
            count = 0;
        }
        n = n >> 1;
    }

    return cntMax;
}

int main()
{
    int n = 0;
    while (cin >> n) {
        cout << GetMaxBit(n) << endl;
    }

    return 0;
}

cc方法03:

/hj086_bits_max_01_stl_00.cc

cpp 复制代码
// stl
#include <iostream>
#include <vector>
#include <bitset>
#include <algorithm>

using namespace std;

int parse(string s)
{
    vector<int> vec;
    char ch = '1';
    int count = 0;
    for (auto it = s.begin(); it != s.end(); ++it) {
        if (*it == ch) {
            count++;
            if (it == s.end() - 1) {
                vec.push_back(count);
            }
        } else {
            if (count > 0) {
                vec.push_back(count);
            }
            count = 0;
        }
    }
    sort(vec.begin(), vec.end());

    return vec.back();
}

int GetMaxBit(const int & n)
{
    bitset<32> bs(n);
    string s = bs.to_string('0', '1');
    return parse(s);
}

int main()
{
    int n = 0;
    while (cin >> n) {
        cout << GetMaxBit(n) << endl;
    }

    return 0;
}
相关推荐
啊我不会诶几秒前
Educational Codeforces Round 120 (Rated for Div. 2) vp补题
c++·算法
贾斯汀玛尔斯4 分钟前
每天学一个算法--图算法(Graph Algorithms)
数据结构·算法
埃伊蟹黄面5 分钟前
C++ —— 智能指针
开发语言·c++·算法
董董灿是个攻城狮6 分钟前
马斯克在用炸火箭的方式训练 AGI。。。
算法
Pentane.9 分钟前
【力扣hot100】【Leetcode 54】螺旋矩阵|边界控制 算法笔记及打卡(19/100)
算法·leetcode·矩阵
黎阳之光9 分钟前
黎阳之光:港口智能体集群,重塑智慧港口新范式
大数据·人工智能·算法·安全·数字孪生
大写的z先生12 分钟前
【深度学习 | 论文精读】
深度学习·算法·语言模型
大肥羊学校懒羊羊12 分钟前
质因数个数问题:高效分解算法详解
开发语言·c++·算法
米粒114 分钟前
力扣算法刷题Day 49(接雨水)
算法·leetcode·职场和发展
探物 AI19 分钟前
【感知实战·数据增强篇】深度解析目标检测中的图片数据增强算法,多图演示效果
人工智能·算法·目标检测