Bootstrap

华为OD机试 - 求最大连续bit数 - 二进制(Python/JS/C/C++ 2024 E卷 100分)

在这里插入图片描述

2025华为OD机试题库(按算法分类):2025华为OD统一考试题库清单(持续收录中)以及考点说明(Python/JS/C/C++)

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。

一、题目描述

求一个int类型数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1。

二、输入描述

输入一个int类型数字。

三、输出描述

输出转成二进制之后连续1的个数。

四、测试用例

测试用例1

1、输入

3

2、输出

2

3、说明

3 的二进制为 11,连续 1 的最大个数为 2。

测试用例2

1、输入

156

2、输出

3

3、说明

156 的二进制为 10011100,其中最长连续 1 的序列为 111,长度 3。

五、解题思路

  1. 首先通过输入获取一个 int 类型的数字;
  2. 使用 Integer.toBinaryString(num) 将该数字转换为二进制字符串;
  3. 使用 split(“0”) 方法将二进制字符串按照 0 进行分割,得到连续的 1 组成的字符串数组;
  4. 遍历字符串数组,找到最长的连续 1 的长度;
  5. 输出最长连续 1 的长度。

六、Python算法源码

# 定义求最大连续1的函数,输入为 int 类型
def maxConsecutiveOnes(n: int) -> int:
    count = 0              # 当前连续1的计数
    max_count = 0          # 记录最大连续1的计数
    # 处理负数情况:Python的整数没有固定位数,若为负数则模拟32位无符号表示
    if n < 0:
        n = n & 0xFFFFFFFF  # 将负数转换为32位无符号整数
    while n:                # 当n不为0时循环
        if n & 1:           # 判断最低位是否为1
            count += 1      # 如果是1,则计数器加1
        else:
            max_count = max(max_count, count)  # 否则更新最大计数
            count = 0       # 重置当前计数器
        n >>= 1             # 右移一位,处理下一个二进制位
    return max(max_count, count)  # 返回最大连续1的个数

# 测试用例列表
test_cases = [3, 15, 156, 0, -1]
# 遍历测试用例并打印结果
for tc in test_cases:
    print(f"输入: {tc} -> 输出: {maxConsecutiveOnes(tc)}")

七、JavaScript算法源码

// 定义求最大连续1的函数,输入为整数 n
function maxConsecutiveOnes(n) {
    let count = 0;          // 当前连续1的计数
    let maxCount = 0;       // 记录最大连续1的计数
    // 处理负数情况,将 n 转换为32位无符号整数
    n = n >>> 0;
    while (n !== 0) {       // 当 n 不为0时循环
        if ((n & 1) === 1) { // 判断最低位是否为1
            count++;       // 如果是1,则计数器加1
        } else {
            maxCount = Math.max(maxCount, count); // 否则更新最大计数
            count = 0;     // 重置当前计数器
        }
        n = n >>> 1;       // 无符号右移一位,处理下一个二进制位
    }
    return Math.max(maxCount, count); // 返回最大连续1的个数
}

// 定义测试用例数组
const testCases = [3, 15, 156, 0, -1];
// 遍历测试用例并在控制台输出结果
for (const tc of testCases) {
    console.log(`输入: ${tc} -> 输出: ${maxConsecutiveOnes(tc)}`);
}

八、C算法源码

#include <stdio.h>
#include <stdlib.h>

// 定义求最大连续1的函数,输入为 int 类型
int maxConsecutiveOnes(int n) {
    unsigned int num = (unsigned int)n; // 将 n 转换为无符号整数,确保右移操作为逻辑右移
    int count = 0;      // 当前连续1的计数
    int maxCount = 0;   // 最大连续1的计数
    while (num != 0) {  // 当 num 不为0时循环
        if (num & 1) {  // 判断最低位是否为1
            count++;    // 如果是1,则计数器加1
        } else {
            // 如果遇到0,则更新最大连续1计数
            if (count > maxCount) {
                maxCount = count;
            }
            count = 0;  // 重置当前计数器
        }
        num >>= 1;      // 右移一位,处理下一个二进制位
    }
    // 返回最大连续1的个数(处理最后一段连续1)
    return count > maxCount ? count : maxCount;
}

int main() {
    // 定义测试用例数组
    int testCases[5] = {3, 15, 156, 0, -1};
    int numTests = 5;
    // 遍历每个测试用例并输出结果
    for (int i = 0; i < numTests; i++) {
        int input = testCases[i];
        int output = maxConsecutiveOnes(input);
        printf("输入: %d -> 输出: %d\n", input, output);
    }
    return 0;
}

九、C++算法源码

#include <iostream>
#include <algorithm> // 包含 std::max 函数
using namespace std;

// 定义求最大连续1的函数,输入为 int 类型
int maxConsecutiveOnes(int n) {
    // 将 n 转换为无符号整数,确保右移操作为逻辑右移
    unsigned int num = static_cast<unsigned int>(n);
    int count = 0;      // 当前连续1的计数
    int maxCount = 0;   // 最大连续1的计数
    while (num != 0) {  // 当 num 不为0时循环
        if (num & 1) {  // 判断最低位是否为1
            count++;    // 如果是1,则计数器加1
        } else {
            maxCount = max(maxCount, count); // 更新最大计数
            count = 0;  // 重置当前计数器
        }
        num >>= 1;      // 无符号右移一位,处理下一个二进制位
    }
    // 返回最大连续1的个数(处理最后一段连续1)
    return max(maxCount, count);
}

int main() {
    // 定义测试用例数组
    int testCases[5] = {3, 15, 156, 0, -1};
    // 遍历每个测试用例并输出结果
    for (int i = 0; i < 5; i++) {
        int input = testCases[i];
        int output = maxConsecutiveOnes(input);
        cout << "输入: " << input << " -> 输出: " << output << endl;
    }
    return 0;
}


🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。

在这里插入图片描述

;