题目描述
对一个数据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
个数据为需要分类的数据
请找到有效类型中包含数据最多的类型,
并输出该类型含有多少个数据
输入描述
输入12
个数据用空格分割,
第一个数据为c
,第二个数据为b
,
剩余10
个数据为需要分类的数据。
输出描述
请找到有效类型中包含数据最多的类型,
并输出该类型含有多少个数据。
示例一
输入
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
所以012
都是有效类型
类型为1
和2
的有3
个数据
类型为0
和3
的只有两个
示例二
输入
1 4 256 257 258 259 260 261 262 263 264 265
输出
2
代码实现
python"># coding utf-8
# 先验知识:ox代表16进制数,要取它的第四位,可以直接 x & 15
# 4字节相加计算方式,以26516为例:
# 二进制: 0110 0111 1001 0100
# 字节数 1 2 3 4
# 如何得到第一个字节:
# 将第一个字节右移3个字节,即是34=12位
# 结果:0000 0000 0000 0110 = 6
# 如何得到第二个字节:
# 将第二个字节右移2个字节,即是24=8位
# 结果:0000 0000 0110 0111
# 现在第二个字节移到了第四个字节,但是第一个字节也移到了第三个字节
# 怎么才能得到我们想要的呢,和0000 0000 0000 0000 1111做与(&)运算即可
# 即:0000 0000 0110 0111
# &0000 0000 0000 1111
# ————————————
# 0000 0000 0000 0111=7
# 第三第四字节以此类推
# 得出公式:(26516>>12)&15+(26516>>8)&15+(26516>>4)&15+26516&15
class Solution:
def dataClassify(self, c, b, arr):
data = arr
count = 0
res = [0 for i in range(len(data))]
for i in range(len(data)):
a1 = (data[i] >> 12) & 15
a2 = (data[i] >> 8) & 15
a3 = (data[i] >> 4) & 15
a4 = data[i] & 15
if (a1 + a2 + a3 + a4) % b < c:
count += 1
res[(a1 + a2 + a3 + a4) % b] += 1
res.sort()
return res[-1]
if __name__ == '__main__':
s = input("input(c b arr1 arr2 .....arrx):").split(' ')
arr = [int(s[i]) for i in range(len(s))]
c = arr[0]
b = arr[1]
arr = arr[2:]
solution = Solution()
print(solution.dataClassify(c, b, arr))