工程环境下我们常使用ProtoBuf
进行数据的序列化传输。ProtoBuf
编码对于Varint
的传输原理就是:将一个整数转化成二进制的形式,从低位开始每七位一组,加上最高位0/1。首位为0表示当前段为此数值传输的最后一段,首位为1表示后面仍然进行传输。例如$(300){10}$转化为二进制后$(1 0010 1100)2$可以分成两组进行传输,且不足7位的用0补足,且从低位依次进行传输:$(1 0101100 ){ProtoBuf}$ $(0 0000010){ProtoBuf}$。因此其在传输的时候的十六进制信息为$0xAC02$。
现在请你设计一个小型整数ProtoBuf
解码器,并拓展以下功能:
-
接受一个十六进制传输数值并将其解码成对应的二进制数据
- 每接受到一个数值,输出其出现次数
- 每接受到一个数值,输出除了当前数值外,可与当前数值构成的二进制最大相似长度
-
删除一个指定数值,如果不存在,则忽略本次操作。
两个数值二进制下的最大相似长度定义为两个数值(不含前导零)的二进制串的最长公共前缀串
6
1 0xAC02
1 0x35
1 0x9D01
1 0x35
2 0x35
1 0x35
1 0
1 1
1 4
2 6
2 6
依次接收到数据$(300){10}$,$(53){10}$,$(157)_{10}$ 对应的二进制分别为
- 对于每个测试点需要在10s内通过
- 通过80%的测试点即视为通过
- 根据
(通过分数, 测试点通过耗时)
双关键字进行排序,从而获得个人rank
-
Hint1:
-
阅读ProtoBuf ProtoBuf Introduction
ProtoBuf
编码对于Varint
的传输原理就是:将一个整数转化成二进制的形式,从低位开始每七位一组,加上最高位0/1。首位为0表示当前段为此数值传输的最后一段,首位为1表示后面仍然进行传输。例如$(300){10}$转化为二进制后$(1 0010 1100)2$可以分成两组进行传输,且不足7位的用0补足,且从低位依次进行传输:$(1 0101100 ){ProtoBuf}$ $(0 0000010){ProtoBuf}$。因此其在传输的时候的十六进制信息为$0xAC02$。
-
-
Hint2:
-
Hint3:
- 可以直接在此代码库上直接进行修改
一个文件夹压缩包 目录如下:
- project
|-xxx.h
|-xxx.h
|-...
|-main.c
使用bazel进行编译