/ProtoBuf_decoder

A decoder of ProtoBuf can solve 2 problems

Primary LanguageC++

问题描述:

工程环境下我们常使用ProtoBuf进行数据的序列化传输。ProtoBuf编码对于Varint的传输原理就是:将一个整数转化成二进制的形式,从低位开始每七位一组,加上最高位0/1。首位为0表示当前段为此数值传输的最后一段,首位为1表示后面仍然进行传输。例如$(300){10}$转化为二进制后$(1 0010 1100)2$可以分成两组进行传输,且不足7位的用0补足,且从低位依次进行传输:$(1 0101100 ){ProtoBuf}$ $(0 0000010){ProtoBuf}$。因此其在传输的时候的十六进制信息为$0xAC02$。

现在请你设计一个小型整数ProtoBuf解码器,并拓展以下功能:

  1. 接受一个十六进制传输数值并将其解码成对应的二进制数据

    1. 每接受到一个数值,输出其出现次数
    2. 每接受到一个数值,输出除了当前数值外,可与当前数值构成的二进制最大相似长度
  2. 删除一个指定数值,如果不存在,则忽略本次操作。

两个数值二进制下的最大相似长度定义为两个数值(不含前导零)的二进制串的最长公共前缀串

样例输入

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}$ 对应的二进制分别为 $(100101100)_2$,$(110101)_2$,$(10011101)_2$

要求

  1. 对于每个测试点需要在10s内通过
  2. 通过80%的测试点即视为通过
  3. 根据(通过分数, 测试点通过耗时)双关键字进行排序,从而获得个人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进行编译