当前位置: 首页 > article >正文

LeetCode 高频题实战:如何优雅地序列化和反序列化字符串数组?

在这里插入图片描述
在这里插入图片描述

文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
      • 编码方法
      • 解码方法
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

在分布式系统中,数据的序列化与反序列化是常见的需求,尤其是在网络传输、数据存储等场景中。LeetCode 第 271 题“字符串的编码与解码”要求我们设计一种方法,将字符串数组编码为单个字符串,并能准确地解码回原始数组。本文将详细解析该问题,提供 Swift 语言的解决方案,并结合实际应用场景进行探讨。

描述

题目描述:

设计一种方法,将字符串数组编码为单个字符串,以便在网络上传输。接收方应能解码该字符串,恢复出原始的字符串数组。

示例:

输入:[“Hello”,“World”]

输出:[“Hello”,“World”]

约束条件:

  • 1 <= strs.length <= 200

  • 0 <= strs[i].length <= 200

  • strs[i] 包含任意可能的字符,包括特殊字符。

进阶:

你能否设计一个通用的算法,适用于任何可能的字符集?

题解答案

为了解决这个问题,我们需要设计一种编码方式,使得编码后的字符串能唯一地表示原始的字符串数组,并且在解码时能准确地恢复。考虑到字符串中可能包含任何字符,包括我们可能选择的分隔符,因此直接使用特殊字符作为分隔符可能导致解码错误。一种可靠的方法是采用长度前缀的方式,即在每个字符串前添加其长度和一个分隔符,这样在解码时可以根据长度准确地提取每个字符串。

题解代码分析

以下是使用 Swift 语言实现的编码和解码方法:

编码方法

class Codec {func encode(_ strs: [String]) -> String {var encoded = ""for str in strs {let length = str.countencoded += "\(length)#\(str)"}return encoded}
}

解析:

  • 我们遍历字符串数组中的每个字符串。

  • 对于每个字符串,计算其长度,并将长度与字符串本身连接,中间使用 # 作为分隔符。

  • 将所有这样的编码片段连接起来,形成最终的编码字符串。

示例:

输入:[“Hello”, “World”]

编码过程:

  • “Hello” → “5#Hello”

  • “World” → “5#World”

最终编码字符串:“5#Hello5#World”

解码方法

extension Codec {func decode(_ s: String) -> [String] {var strs = [String]()var i = s.startIndexwhile i < s.endIndex {var j = iwhile s[j] != "#" {j = s.index(after: j)}let length = Int(s[i..<j])!let start = s.index(after: j)let end = s.index(start, offsetBy: length)strs.append(String(s[start..<end]))i = end}return strs}
}

解析:

  • 我们使用两个索引 ij 来遍历编码字符串。

  • 首先,找到下一个 # 分隔符,提取出长度信息。

  • 然后,根据长度提取出对应的字符串。

  • 将提取出的字符串添加到结果数组中,继续处理下一个编码片段。

示例:

编码字符串:“5#Hello5#World”

解码过程:

  • 提取长度 5,字符串 “Hello”

  • 提取长度 5,字符串 “World”

最终结果:[“Hello”, “World”]

示例测试及结果

我们可以通过以下示例来验证编码和解码方法的正确性:

let codec = Codec()
let original = ["Hello", "World", "Swift", "LeetCode"]
let encoded = codec.encode(original)
print("Encoded: \(encoded)")
let decoded = codec.decode(encoded)
print("Decoded: \(decoded)")

输出:

Encoded: 5#Hello5#World5#Swift8#LeetCode
Decoded: ["Hello", "World", "Swift", "LeetCode"]

可以看到,解码后的结果与原始数组完全一致,验证了方法的正确性。

时间复杂度

  • 编码方法:

    • 我们遍历字符串数组中的每个字符串,计算其长度并进行字符串连接。

    • 假设字符串数组中有 n 个字符串,总字符数为 k,则时间复杂度为 O(k)。

  • 解码方法:

    • 我们遍历编码字符串,提取每个字符串的长度和内容。

    • 同样,时间复杂度为 O(k)。

空间复杂度

  • 编码方法:

    • 我们构建了一个新的字符串,长度为原始字符串总长度加上长度前缀和分隔符的长度。

    • 因此,空间复杂度为 O(k)。

  • 解码方法:

    • 我们构建了一个新的字符串数组,包含原始的所有字符串。

    • 因此,空间复杂度为 O(k)。

总结

通过在每个字符串前添加其长度和一个分隔符,我们可以可靠地将字符串数组编码为单个字符串,并能准确地解码回原始数组。这种方法避免了使用特殊字符作为分隔符可能带来的问题,具有较高的可靠性和通用性。在实际应用中,如网络传输、数据存储等场景,这种编码方式具有重要的实用价值。

在更复杂的系统中,我们可能需要处理更复杂的数据结构,如嵌套的数组、字典等。此时,可以考虑使用更通用的序列化方法,如 JSON、XML 等,或者使用专门的序列化框架,如 Protocol Buffers、Thrift 等,以满足更高的性能和可扩展性需求。

相关文章:

LeetCode 高频题实战:如何优雅地序列化和反序列化字符串数组?

文章目录 摘要描述题解答案题解代码分析编码方法解码方法 示例测试及结果时间复杂度空间复杂度总结 摘要 在分布式系统中&#xff0c;数据的序列化与反序列化是常见的需求&#xff0c;尤其是在网络传输、数据存储等场景中。LeetCode 第 271 题“字符串的编码与解码”要求我们设…...

为什么拆分高低字节而不直接存入数组

您的代码片段是在将一个16位值&#xff08;&#xff09;拆分为高字节和低字节&#xff1a;IR_RF_Signal.length temp_low IR_RF_Signal.length & 0xFF; temp_high IR_RF_Signal.length >> 8; 虽然我在 PX4-Autopilot 仓库中没有找到这段确切的代码&#xff0c;…...

python打卡day22@浙大疏锦行

复习日 仔细回顾一下之前21天的内容&#xff0c;没跟上进度的同学补一下进度。 作业&#xff1a; 自行学习参考如何使用kaggle平台&#xff0c;写下使用注意点&#xff0c;并对下述比赛提交代码 一、数据预处理 import pandas as pd import numpy as np import matplo…...

C#游戏开发中的注意事项

目录 一、性能优化:提升游戏运行效率 1. 避免不必要的循环和迭代 2. 减少字符串拼接 3. 利用Unity的生命周期函数 4. 使用对象池(Object Pooling) 二、内存管理:避免内存泄漏和资源浪费 1. 及时释放非托管资源 2. 避免空引用异常 3. 合理使用引用类型和值类型 4. …...

Spring Boot项目(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot前后端分离)

下载地址&#xff1a; 前端&#xff1a;https://download.csdn.net/download/2401_83418369/90811402 后端&#xff1a;https://download.csdn.net/download/2401_83418369/90811405 一、前端vue部分的搭建 这里直接看另一期刊的搭建Vue前端工程部分 前端vue后端ssm项目_v…...

Spyglass:在batch/shell模式下运行目标的顶层是什么?

相关阅读 Spyglasshttps://blog.csdn.net/weixin_45791458/category_12828934.html?spm1001.2014.3001.5482 除了可以在图形用户界面(GUI)中运行目标外&#xff0c;使用Batch模式或Shell模式也可以运行目标&#xff0c;如下面的命令所示。 % spyglass -project test.prj -ba…...

没有Mac,我是怎么上传IPA到App Store的?

没有Mac&#xff0c;我是怎么上传IPA到App Store的&#xff1f; 最近赶一个小项目上线&#xff0c;写的是一个Flutter做的App。安卓版本一晚上搞定&#xff0c;iOS上架却差点把人整崩。 不是我技术菜&#xff0c;是实在太麻烦了。最关键的&#xff0c;是我这台Windows笔电根本…...

微服务架构中如何保证服务间通讯的安全

在微服务架构中,保证服务间通信的安全至关重要。服务间的通信通常是通过HTTP、gRPC、消息队列等方式实现的,而这些通信链路可能面临多种安全风险。为了应对这些风险,可以采取多种措施来保证通信安全。 常见的服务间通信风险 1.数据泄露:在服务间通信过程中,敏感数据可能会…...

2025-05-11 项目绩效域记忆逻辑管理

好的&#xff0c;我们可以用一个故事来帮助记忆这些规划绩效域的要素&#xff0c;同时通过逻辑关系来串联它们。以下是一个故事化的版本&#xff1a; 《项目管理的奇幻之旅》 在一个遥远的王国里&#xff0c;有一个勇敢的项目经理名叫小K。小K被国王赋予了一个艰巨的任务&…...

工具篇-Cherry Studio之MCP使用

一、添加MCP 打开Cherry Studio,如果没有可以到官网下载:Cherry Studio 官方网站 - 全能的AI助手 按上面步骤打开同步服务器 1、先去注册ModelScope,申请令牌 2、再打开MCP广场,找到高德MCP 选择工具测试,这里有个高德的api key需要申请 打开如下地址高德开放平…...

DeepSeek“智”造:解锁旅游行业新玩法

目录 一、DeepSeek 简介1.1 DeepSeek 技术原理1.2 DeepSeek 在 AI 领域地位 二、DeepSeek 在旅游攻略生成的应用2.1 生成流程展示2.2 优势分析2.3 实际案例剖析 三、DeepSeek 助力旅游宣传文案创作3.1 文案创作模式3.2 效果评估3.3 创意亮点挖掘 四、DeepSeek 优化游客咨询服务…...

LOJ 6346 线段树:关于时间 Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​)&#xff0c;另有一个存储三元组的列表 L L L. 有 m m m 个操作分两种&#xff1a; add ⁡ ( l , r , k ) \operatorname{add}(l,r,k) add(l,r,k)&#xff1a;将 ( l , r , …...

java 多核,多线程,分布式 并发编程的现状 :从本身的jdk ,到 spring ,到其它第三方。

Java 在多核、多线程和高性能编程领域提供了丰富的现成框架和工具&#xff0c;既有标准库中的并发组件&#xff0c;也有第三方框架。以下是一些关键框架及其应用场景的总结&#xff1a;便于后面我们站在巨人的肩膀上&#xff0c;继续前行 一、Java 标准库中的多线程框架 Execut…...

httpclient请求出现403

问题 httpclient请求对方服务器报403&#xff0c;用postman是可以的 解决方案: request.setHeader( “User-Agent” ,“Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0” ); // 设置请求头 原因&#xff1a; 因为没有设置为浏览器形式&#…...

Python 运维脚本

1、备份文件 import os import shutil# 定义配置文件目录和备份目录的路径 config_dir "/root/python/to/config/files/" backup_dir "/root/python/to/backup/"# 遍历配置文件目录中的所有文件 for filename in os.listdir(config_dir):# 如果文件名以…...

MySQL数据库常见面试题之三大范式

写在前面 此文章大部分不会引用最原始的概念&#xff0c;采用说人话的方式。 面试题&#xff1a;三大范式是什么&#xff1f;目的是什么&#xff1f;必须遵循吗&#xff1f; 假设有一张表&#xff08;学号&#xff0c;姓名&#xff0c;课程&#xff0c;老师&#xff09; 是…...

大模型项目:普通蓝牙音响接入DeepSeek,解锁语音交互新玩法

本文附带视频讲解 【代码宇宙019】技术方案&#xff1a;蓝牙音响接入DeepSeek&#xff0c;解锁语音交互新玩法_哔哩哔哩_bilibili 目录 效果演示 核心逻辑 技术实现 大模型对话&#xff08;技术&#xff1a; LangChain4j 接入 DeepSeek&#xff09; 语音识别&#xff08;…...

C/C++复习--C语言隐式类型转换

目录 什么是隐式类型转换&#xff1f;整型提升 规则与示例符号位扩展的底层逻辑 算术转换 类型层次与转换规则混合类型运算的陷阱 隐式转换的实际应用与问题 代码示例分析常见错误与避免方法 总结与最佳实践 1. 什么是隐式类型转换&#xff1f; 隐式类型转换是C语言在编译阶段…...

Pandas 时间处理利器:to_datetime() 与 Timestamp() 深度解析

Pandas 时间处理利器&#xff1a;to_datetime() 与 Timestamp() 深度解析 在数据分析和处理中&#xff0c;时间序列数据扮演着至关重要的角色。Pandas 库凭借其强大的时间序列处理能力&#xff0c;成为 Python 数据分析领域的佼佼者。其中&#xff0c;to_datetime() 函数和 Ti…...

单链表设计与实现

01. 单链表简介 在数据结构中&#xff0c;单链表的实现可以分为 带头结点 和 不带头结点 两种方式&#xff0c;这里我们讨论第二种方式。 头结点&#xff1a;链表第一个节点不存实际数据&#xff0c;仅作为辅助节点指向首元节点&#xff08;第一个数据节点&#xff09;。头指…...

JDS-算法开发工程师-第9批

单选题 print(fn.__default__) 哪一个不是自适应学习率的优化算法 (选项&#xff1a;Adagrad&#xff0c;RMSprop&#xff0c;Adam&#xff0c;Momentum&#xff0c;动量法在梯度下降的基础上&#xff0c;加入了“惯性”概念&#xff0c;通过累积历史的梯度更新来加速收敛&…...

Git标签删除脚本解析与实践:轻松管理本地与远程标签

Git 标签删除脚本解析与实践:轻松管理本地与远程标签 在 Git 版本控制系统中,标签常用于标记重要的版本节点,方便追溯和管理项目的不同阶段。随着项目的推进,一些旧标签可能不再需要,此时就需要对它们进行清理。本文将通过一个完整的脚本,详细介绍如何删除本地和远程的 …...

Python中,async和with结合使用,有什么好处?

在Python的异步编程中&#xff0c;async和with的结合使用&#xff08;即async with&#xff09;为开发者提供了一种优雅且高效的资源管理模式。这种组合不仅简化了异步代码的编写&#xff0c;还显著提升了程序的健壮性和可维护性。以下是其核心优势及典型应用场景的分析&#x…...

springboot生成二维码到海报模板上

springboot生成二维码到海报模板上 QRCodeController package com.ruoyi.web.controller.app;import com.google.zxing.WriterException; import com.ruoyi.app.domain.Opportunity; import com.ruoyi.app.tool.QRCodeGenerator; import com.ruoyi.common.core.page.TableDat…...

SEO长尾关键词布局优化法则

内容概要 在SEO优化体系中&#xff0c;长尾关键词的精准布局是突破流量瓶颈的关键路径。相较于竞争激烈的核心词&#xff0c;长尾词凭借其高转化率和低竞争特性&#xff0c;成为内容矩阵流量裂变的核心驱动力。本节将系统梳理长尾关键词布局的核心逻辑框架&#xff0c;涵盖从需…...

python:trimesh 用于 STL 文件解析和 3D 操作

python&#xff1a;trimesh 是一个用于处理三维模型的库&#xff0c;支持多种格式的导入导出&#xff0c;比如STL、OBJ等&#xff0c;还包含网格操作、几何计算等功能。 Python Trimesh 库使用指南 安装依赖库 pip install trimesh Downloading trimesh-4.6.8-py3-none-any.w…...

应急响应基础模拟靶机-security2

PS:杰克创建的流量包(result.pcap)在root目录下&#xff0c;请根据已有信息进行分析 1、首个攻击者扫描端口使用的工具是&#xff1f; 2、后个攻击者使用的漏洞扫描工具是&#xff1f; 3、攻击者上传webshell的绝对路径及User-agent是什么&#xff1f; 4、攻击者反弹shell的…...

ROS 2 FishBot PID控制电机代码

#include <Arduino.h> #include <Wire.h> #include <MPU6050_light.h> #include <Esp32McpwmMotor.h> #include <Esp32PcntEncoder.h>Esp32McpwmMotor motor; // 创建一个名为motor的对象&#xff0c;用于控制电机 Esp32PcntEncoder enco…...

Bash 字符串语法糖详解

Bash 作为 Linux 和 Unix 系统中最常用的 Shell 之一&#xff0c;其字符串处理能力是脚本开发者的核心技能之一。为了让字符串操作更高效、更直观&#xff0c;Bash 提供了丰富的语法糖&#xff08;syntactic sugar&#xff09;。这些语法糖通过简洁的语法形式&#xff0c;隐藏了…...

OpenCV定位地板上的书

任务目标是将下面的图片中的书本找出来&#xff1a; 使用到的技术包括&#xff1a;转灰度图、提取颜色分量、二值化、形态学、轮廓提取等。 我们尝试先把图片转为灰度图&#xff0c;然后二值化&#xff0c;看看效果&#xff1a; 可以看到&#xff0c;二值化后&#xff0c;书的…...