华为OD机试 - 模拟数据序列化传输(Python/JS/C/C++ 2025 B卷 200分)

一、题目描述

模拟一套简化的序列化传输方式,请实现下面的数据编码与解码过程。

编码前数据格式为[位置,类型,值],多个数据的时侯用逗号隔开,位置仅支持数字,不考虑重复场景;类型仅支持: Integer / String / Compose(Compose的数据类型表示该存储的数据也需要编码)。

编码后数据参考图示,数据区的格式是: 位置#类型#长度#数据,类型存储需要编码,Integer->0;String->1;Compose->2,长度是指数据的字符长度;数据仅允许数字、大写字母、小写字母、空格。

输入的编码字符长度不能超过1000,一个数据的格式错误,则解码剩余数据,其他错误输出ENCODE_ERROR。

输入的解码字符不能超过1000,数据区异常则跳过,继续解析剩余数据区,其余异常输出DECODE_ERROR。

二、输入描述

输入有行:

第一行是命令,1表示编码,2表示解码,第二行为输入待解码、解码的字符,数据最多嵌套10层,[1,Compose,[1,String,Second]] 为2层嵌套。

三、输出描述

如果输入要求是编码,则输出编码结果;如果输入要求是解码,则输出解码结果;当异常时输出对应的错误字符。

四、测试用例

测试用例1:

1、输入

1
[1,String,I am Mary],[2,

华为OD模拟数据序列化传输问题在不同语言中有不同的实现方式,以下为你别介绍: ### Java 实现 虽然未给出具体 Java 代码,但可以按照以下思路实现: 1. 定义数据项类型映射,如 `Integer→0`,`String→1`,`Compose→2`。 2. 使用括号匹配技术解析每个 `[位置,类型,值]` 数据项。 3. 按格式 `位置#类型编码#数据长度#数据` 生成编码,对于 `Compose` 类型递归编码内部数据。 4. 对于解码,使用正则表达式 `(\d+)#(\d+)#(\d+)#` 解析 `位置#类型#长度#数据` 格式,若语言不支持正则则手动解析,解析 `Compose` 时递归调用解码函数。 5. 异常处理方面,若数据项格式错误,继续解析剩余部,其他异常返回 `"DECODE_ERROR"`。 ### C 语言实现 - **编码**:递归解析 `[...]` 格式,`Compose` 类型的值需要嵌套递归处理,组装 `位置#类型#长度#数据` 格式。 - **解码**:由于 C 语言不支持正则,手动解析 `位置#类型#长度#数据` 格式,解析 `Compose` 时递归调用 `decode()` 解析嵌套部,按 `[位置,类型,值]` 还原格式。 - **异常处理**:数据项格式错误,继续解析剩余部,其他异常返回 `"DECODE_ERROR"` [^2]。 ### Python/JS/C/C++ 实现 以示例数据 `[1,String,I am Mary],[2,Integer,23],[3,Integer,879],[4,Compose,[1,String,I am Kitty],[2,Integer,44]]` 为例: - **解题思路**: - 使用括号匹配技术解析每个 `[位置,类型,值]` 数据项。 - 类型映射:`Integer→0`,`String→1`,`Compose→2`。 - 按格式 `位置#类型编码#数据长度#数据` 生成编码,对 `Compose` 类型递归编码内部数据 [^3]。 以下是一个简化的 Python 示例代码: ```python # 类型映射 type_mapping = { "Integer": 0, "String": 1, "Compose": 2 } def encode(data): result = [] for item in data.split("],["): item = item.strip("[]") position, data_type, value = item.split(",", 2) if data_type == "Compose": inner_encoded = encode(value.strip("[]")) encoded = f"{position}#{type_mapping[data_type]}#{len(inner_encoded)}#{inner_encoded}" else: encoded = f"{position}#{type_mapping[data_type]}#{len(value)}#{value}" result.append(encoded) return ",".join(result) data = "[1,String,I am Mary],[2,Integer,23],[3,Integer,879],[4,Compose,[1,String,I am Kitty],[2,Integer,44]]" encoded_data = encode(data) print(encoded_data) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪 吒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值