【华为OD题库-028】数据分类-java

题目

对一个数据a进行分类,分类方法为:此数据a (四个字节大小)的四个字节相加对一个给定的值b取模,如果得到的结果小于一个给定的值c,则数据a为有效类型,其类型为取模的值;如果得到的结果大于或者等于c,则数据a为无效类型。
比如一个数据a=0x01010101, b=3, 按照分类方法计算(0x01+0x01+0x01+0x01) %3=1,
所以如果c=2,则此a为有效类型,其类型为1,如果c=1,则此a为无效类型;
又比如一个数据a=0x01010103, b=3, 按照分类方法计算(0x01+0x01 +0x01+0x03) %3=0,
所以如果c=2,则此a为有效类型,其类型为0,如果c=0,则此a为无效类型。
输入12个数据,第一个数据为C, 第二个数据为b, 剩余10个数据为需要分类的数据,
请找到有效类型中包含数据最多的类型,并输出该类型含有多少个数据。
输入描述
输入12个数据,用空格分隔,第一个数据为c, 第二个数据为b,剩余10个数据为需要分类的数据。
输出描述
输出最多数据的有效类型有多少个数据。
示例1 输入输出示例仅供调试,后台判题数据般不包含示例
输入
3 4 256 257 258 259 260 261 262 263 264 265
输出
3
说明
10个数据4个字节相加后的结果分别为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个数据,类型为0的只有2个数据,故输出3。
示例2 输入输出示例仅供调试,后台判题数据一般不包含示例
输入
1 4 256 257 258 259 260 261 262 263 264 265
输出
2
说明
10个数据4个字节相加后的结果分别为1 2 3 4 5 6 7 8 9 10,
故对4取模的结果为1 2 3 0 1 2 3 0 1 2, c为1,
所以只有0是有效类型,类型为0的有2个数据,故输出2。

思路

此题关键在于对于给定整数,怎么求四字节的和?
比如任意整数a:
00001000 0000110 0010001 00010010
求a第一个字节(从右往左):a&0xff
求a第二个字节:a>>8 & 0xff
求a第三个字节:a>>16 & 0xff
求a第四个字节:a>>24 & 0xff
这点想通后,根据题目描述写剩余逻辑即可。

题解

package hwod;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class DataCategory {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int c = sc.nextInt();
        int b = sc.nextInt();
        int[] nums = new int[10];
        for (int i = 0; i < 10; i++) {
            nums[i] = sc.nextInt();
        }
        System.out.println(dataCategory(nums, c, b));
    }

    private static int dataCategory(int[] nums, int c, int b) {
        int[] new_nums = Arrays.stream(nums)
                .map(DataCategory::getDealNum)
                .map(x -> x % b)
                .filter(x -> x < c)
                .toArray();
        Map<Integer, Integer> map = new HashMap<>();
        int ans = 0;
        for (int num : new_nums) {
            int val = map.getOrDefault(num, 0) + 1;
            map.put(num, val);
            ans = Math.max(ans, val);
        }

        return ans;
    }


    //返回四个字节相加和
    private static int getDealNum(int n) {
        int ans = 0;
        int b = 0xff;
        for (int i = 0; i < 4; i++) {
            ans += n >> (8 * i) & b;

        }
        return ans;

    }


}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。

说明

本专栏所有文章均为原创,欢迎转载,请注明文章出处:https://blog.csdn.net/qq_31076523/article/details/134176793。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值