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;
}
相关推荐
hhzz9 分钟前
机器学习-算法模型系列文章:07-SVM 一巴掌拍出来的超平面:SVM核函数选错,再干净的数据也救不了你
算法·机器学习·支持向量机
geovindu21 分钟前
java: Gale-Shapley Algorithm
java·开发语言·后端·算法
独隅37 分钟前
CLion 接入 Codex 的完整配置使用全面指南
c++·ide·ai·c++23
冻柠檬飞冰走茶40 分钟前
PTA基础编程题目集 7-34 通讯录的录入与显示(C语言实现)
c语言·开发语言·数据结构·算法
zander2581 小时前
LeetCode 79. 单词搜索
算法·深度优先
老洋葱Mr_Onion1 小时前
【C++】高精度模板
开发语言·c++·算法
脚踏实地皮皮晨1 小时前
003003002_WPF Grid 基类官方类定义逐行深度解析
开发语言·windows·算法·c#·wpf·visual studio
我不是懒洋洋2 小时前
从零实现一个分布式计算:MapReduce的核心设计
c++
aaaameliaaa10 小时前
字符函数和字符串函数
c语言·笔记·算法
城管不管11 小时前
ReAct、Plan-and-Execute、Reflection 三大智能 Agent 范式核心区别
java·人工智能·算法·spring·ai·动态规划