2025 B卷 100分 题型
本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析;
并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式!
本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》
华为OD机试真题《数据分类》:
目录
题目名称:数据分类
- 知识点:位运算、逻辑处理
- 时间限制:1秒
- 空间限制:256MB
- 限定语言:不限
题目描述
对一个数据 a 进行分类,分类方法为:
- 将 a(四个字节大小)的四个字节的十进制值相加,得到一个总和。
- 将此总和对一个给定的值 b 取模。
- 若取模结果小于另一个给定值 c,则该结果为 a 的有效类型;否则类型无效。
输入描述
- 输入12个数据,以空格分隔:
- 第一个数据为 c,第二个数据为 b,剩余10个数据为待分类的整数(每个数 ≤ 1e9)。
输出描述
- 统计有效类型中包含数据最多的类型,输出其数据个数。若所有类型均无效,输出
0
。
示例1
输入:
3 4 256 257 258 259 260 261 262 263 264 265
输出:
3
说明
- 每个数转换为四个字节的十六进制字符串(不足8位补前导0),例如256补为
00000100
,每个字节转为十进制相加,结果为0 + 0 + 1 + 0 = 1
。 - 10个数的总和分别为
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
,对4取模结果为1, 2, 3, 0, 1, 2, 3, 0, 1, 2
。 - 因
c=3
,有效类型为0、1、2,其中类型1和2各有3个数据,故输出3。
补充说明
- 每个整数需转换为四个字节的十六进制表示,例如
256
转为00000100
,拆分后字节为0x00, 0x00, 0x01, 0x00
。 - 需统计所有有效类型的出现次数,取最大值。
Java
问题分析
我们需要根据输入的整数数组进行分类,分类规则基于每个整数的四个字节之和的模运算结果。统计有效类型中出现次数最多的数据个数,若所有类型无效则输出0。
解题思路
- 输入处理:读取c、b和10个待分类的整数。
- 字节和计算:将每个整数拆分为四个字节,计算各字节的十进制和。
- 模运算与分类:计算字节和对b取模,判断是否小于c,记录有效类型。
- 统计与输出:统计有效类型的出现次数,输出最大值。
代码实现
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String[] input = scanner.nextLine().split(" ");
// 解析输入参数
int c = Integer.parseInt(input[0]);
int b = Integer.parseInt(input[1]);
int[] nums = new int[10];
for (int i = 0; i < 10; i++) {
nums[i] = Integer.parseInt(input[i + 2]);
}
Map<Integer, Integer> typeCount = new HashMap<>(); // 统计有效类型出现次数
for (int num : nums) {
// 计算四个字节的十进制和
int sum = 0;
sum += (num >> 24) & 0xFF; // 最高位字节
sum += (num >> 16) & 0xFF;
sum += (num >> 8) & 0xFF;
sum += num & 0xFF; // 最低位字节
int mod = sum % b; // 取模结果
if (mod < c) {
// 判断是否有效
typeCount.put(mod, typeCount.getOrDefault(mod, 0) + 1);
}
}
// 找出最大出现次数
int max = 0;
for (int count : typeCount.values()) {
if (count > max) max = count;
}
System.out.println(max);
}
}
代码详细解析
- 输入处理:使用
Scanner
读取输入并分割成字符串数组,解析出c
、b
和10个整数。 - 字节和计算:
- 通过位运算
(num >> n) & 0xFF
依次提取四个字节的值。 - 累加四个字节的十进制值得到总和。
- 通过位运算
- 模运算与分类:计算总和对
b
取模,若结果小于c
则记录到哈希表中。 - 统计与输出:遍历哈希表的值,找到最大出现次数并输出。
示例测试
示例1输入:
3 4 256 257 258 259 260 261 262 263 264 265
输出:
3
解析:有效类型为0、1、2,类型1和2各出现3次。
示例2输入:
5 3 1 2 3 4 5 6 7 8 9 10
输出:
10
解析:所有模结果均小于5,所有类型有效,最大值10。
示例3输入:
0 1 100 200 300 400 500 600 700 800 900 1000
输出:
0
解析:c=0
,所有模结果不小于0,无有效类型。
综合分析
- 时间复杂度:O(n),其中n=10,每个数处理时间为常数