华为OD机试真题——数据分类(2025B卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

在这里插入图片描述

2025 B卷 100分 题型

本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析;
并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式!

本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享

华为OD机试真题《数据分类》:



题目名称:数据分类


  • 知识点:位运算、逻辑处理
  • 时间限制:1秒
  • 空间限制:256MB
  • 限定语言:不限

题目描述

对一个数据 a 进行分类,分类方法为:

  1. a(四个字节大小)的四个字节的十进制值相加,得到一个总和。
  2. 将此总和对一个给定的值 b 取模。
  3. 若取模结果小于另一个给定值 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。


解题思路

  1. 输入处理:读取c、b和10个待分类的整数。
  2. 字节和计算:将每个整数拆分为四个字节,计算各字节的十进制和。
  3. 模运算与分类:计算字节和对b取模,判断是否小于c,记录有效类型。
  4. 统计与输出:统计有效类型的出现次数,输出最大值。

代码实现

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);
    }
}

代码详细解析

  1. 输入处理:使用Scanner读取输入并分割成字符串数组,解析出cb和10个整数。
  2. 字节和计算
    • 通过位运算(num >> n) & 0xFF依次提取四个字节的值。
    • 累加四个字节的十进制值得到总和。
  3. 模运算与分类:计算总和对b取模,若结果小于c则记录到哈希表中。
  4. 统计与输出:遍历哈希表的值,找到最大出现次数并输出。

示例测试

示例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,无有效类型。


综合分析

  1. 时间复杂度:O(n),其中n=10,每个数处理时间为常数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纪元A梦

再小的支持也是一种动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值