题目要求对一段经过编码的二进制数据进行校验,数据由0个或多个编码单元组成。编码单元分为两种类型:简单编码单元和复杂编码单元。简单编码单元的TAG为0xF0
,后面跟随4字节的值;复杂编码单元的TAG为0xF1
,后面包含一个重复次数(1字节)、一个长度(4字节),以及指定字节数的值部分,这部分可以由0个或多个编码单元组成。输入为一行16进制表示的编码数据,输出解码后的总字节数或-1
表示不合法。如果编码数据符合规则,计算解码后的总长度;否则,返回-1
表示数据不合法。
F0是普通编码,我们直接识别即可。
F1是复杂编码,它指示着后续的len长度的字节数据会重复rep次。而且我们发现这len长度的字节数据内同样可以蕴含F1编码。所以我们自然想到需要用递归来拆解这个编码。
指定有一段经过编码的二进制数据,数据由0个或多个"编码单元"组成。
编码单元“的编码方式存在如下两种:
1.简单编码单元如下所示,其中:
TAG所占长度须为1字节,其值须为0×F0
SINGLE−VALUE的长度固定为4字节
2.复杂编码单元如下所示,其中:
TAG所占长度须为1字节,其值须为0×F1
REPEAT所占长度固定为1字节,用于指示值在解码后消息中重复的次数
LEN所占长度固定为4字节,用于指示值的字节数,LEN使用大端序表示
值部分**必须由0个或多个“编码单元"**组成,且长度必须为LEN字段所指示的字节数
编码后的数据必须完全符合上述两个原则,不允许有任何冗余的字节,请根据上述规则对一段编码后的数据进行校验,如果完全符合上述约束则输出解码后的长度,否则输出−1。
输入一行编码后的二进制数据,按字节16进制表示,如
F0 00 08 09 00
表示一串5字节的编码后数据
输入的字节数n 0≤n≤100000
输出解码后的值的字节数,不符合约束返回−1
输入
F1 02 00 00 00 05 F0 01 02 03 04
输出
8
说明
该码流存在一个复杂编码单元,其中包含一个简单编码单元(内容4字节),复杂编码单元的重复数为2,所以解码后的总长度为8字节
输入
F1 01 00 00 00 04 F0 01 05
输出
-1
说明
第一个编码单元是复杂编码单元,重复数为1,长度为4,但是长度后的内容仅有3字节,码流不合法,返回−1
输入
F1 01 00 00 00 06 F0 00 00 00 03 03 03
输出
-1
说明
第一个编码单元为复杂编码单元,重复数为1、长度为6,
其中的内容从第一个字节开始为一个简单编码单元,
但简单编码单元后存在数据 03 03 既不属于简单单元,
也不属于复杂编码单元,为冗余数据,整体数据不合法、应输出−1