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。
五、解题思路
- 首先通过输入获取一个 int 类型的数字;
- 使用 Integer.toBinaryString(num) 将该数字转换为二进制字符串;
- 使用 split(“0”) 方法将二进制字符串按照 0 进行分割,得到连续的 1 组成的字符串数组;
- 遍历字符串数组,找到最长的连续 1 的长度;
- 输出最长连续 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算法的适用场景,发现新题目,随时更新。