【华为面试基础题】数据分类

描述

对一个数据a进行分类,分类方法是,此数据a(4个字节大小)的4个字节相加对一个给定值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个数据为需要分类的数据。

输出描述:
请找到有效类型中包含数据最多的类型,并输出该类型含有多少个数据。

示例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和3的只有两个

input_str = input()
input_list = input_str.split()
c = int(input_list[0])
b = int(input_list[1])
data = [int(x) for x in input_list[2:]]#不可直接int,会报错
def class_data(c,b,data):
	res = {}
	for i in data: #遍历`data`列表中的每个元素`i`。
	    tmp = str(i) 
	    tmp = "0" * (8 - len(tmp)) + tmp #将元素`i`转换为字符串类型,并在前面补0,使其长度为8。
	    sum = 0 #初始化一个变量`sum`用于存储当前元素对应的十六进制字符串的前8位数字之和。
	    for j in range(0, len(tmp), 2): #遍历当前元素的十六进制字符串,每两个字符为一组
	        g = tmp[j:j + 2]
	        sum += int(g, 16) #计算它们的十进制值并累加到`sum`中。
	        #int(g, 16)`表示将字符串g从十六进制转换为十进制整数。
	    mo = sum % b #计算`sum`对`b`取模的结果`mo`。
	    if mo < c:  #如果`mo`小于`c`,则检查`res`字典中是否已经存在键为`mo`的项
	        if mo not in res.keys(): #在`res`字典中添加一个键为`mo`,值为0的项;如果已存在,则将其值加1。
	            res[mo] = 0
	        res[mo] += 1 
	res = sorted(res.items(), key=lambda x: x[1], reverse=True)[0][1]# 对`res`字典中的键值对按照值进行降序排序,输出第一个键值对的值(即满足条件的元素个数)
	return res
	
print(class_data(c,b,data))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值