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 等,以滿足更高的性能和可擴展性需求。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/905103.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905103.shtml
英文地址,請注明出處:http://en.pswp.cn/news/905103.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GitHub打開緩慢甚至失敗的解決辦法

在C:\Windows\System32\drivers\etc的hosts中增加如下內容&#xff1a; 20.205.243.166 github.com 199.59.149.236 github.global.ssl.fastly.net185.199.109.153 http://assets-cdn.github.com 185.199.108.153 http://assets-cdn.github.com 185.199.110.153 http://asset…

重生之我在2024學Fine-tuning

一、Fine-tuning&#xff08;微調&#xff09;概述 Fine-tuning&#xff08;微調&#xff09;是機器學習和深度學習中的一個重要概念&#xff0c;特別是在預訓練模型的應用上。它指的是在模型已經通過大量數據訓練得到一個通用的預訓練模型后&#xff0c;再針對特定的任務或數據…

計算機網絡 4-2-1 網絡層(IPv4)

2 IPv4分組 各協議之間的關系 IP協議(Internet Protocol, 網際協議)是互聯網的核心&#xff01; ARP協議用于查詢同一網絡中的<主機IP地址&#xff0c;MAC地址>之間的映射關系 ICMP協議用于網絡層實體之間相互通知“異常事件” IGMP協議用于實現IP組播 2.1 結構<首…

Docker中運行的Chrome崩潰問題解決

問題 各位看官是否在 Docker 容器中的 Linux 桌面環境&#xff08;如Xfce&#xff09;上啟動Chrome &#xff0c;遇到了令人沮喪的頻繁崩潰問題&#xff1f;尤其是在打開包含圖片、視頻的網頁&#xff0c;或者進行一些稍復雜的操作時&#xff0c;窗口突然消失&#xff1f;如果…

K8S cgroups詳解

以下是 Kubernetes 中 cgroups&#xff08;Control Groups&#xff09; 的詳細解析&#xff0c;涵蓋其核心原理、在 Kubernetes 中的具體應用及實踐操作&#xff1a; 一、cgroups 基礎概念 1. 是什么&#xff1f; cgroups 是 Linux 內核提供的 資源隔離與控制機制&#xff0c…

javaer快速從idea轉戰vscode

插件安裝列表 在插市場安裝下面插件 Extension Pack for JavaSpring Boot Tools 配置文件提示Database Client Database/No-SQL管理工具httpYac - Rest Client .http文件編輯、API測試工具 https://httpyac.github.io/guide/request.htmlGit Graph 圖形化Git工具XML by Red H…

[項目總結] 抽獎系統項目技術應用總結

&#x1f338;個人主頁:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;?熱門專欄: &#x1f9ca; Java基本語法(97平均質量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection與…

【趙渝強老師】TiDB SQL層的工作機制

TiDB節點的SQL層&#xff0c;即TiDB Server&#xff0c;它負責將SQL翻譯成Key-Value操作&#xff0c;將其轉發給共用的分布式Key-Value存儲層TiKV&#xff0c;然后組裝TiKV返回的結果&#xff0c;最終將查詢結果返回給客戶端。這一層的節點都是無狀態的&#xff0c;節點本身并不…

性能遠超SAM系模型,蘇黎世大學等開發通用3D血管分割基礎模型

如果把人的身體比作一座龐大的城市&#xff0c;那么血管無疑就是這座城市的「道路」&#xff0c;動脈、靜脈以及毛細血管對應著高速公路、城市道路以及鄉間小道&#xff0c;它們相互協作&#xff0c;通過血液將營養物質、氧氣等輸送到身體各處&#xff0c;從而維持著這座「城市…

git高效殺器——cz-customizable 搭配 commitlint

What is cz-customizable and commitlint? cz-customizable 一款可定制化的Commitizen插件(也可作為獨立工具),旨在幫助創建如約定式提交規范的一致性提交消息。commitlint commitlint 是一個用于檢查 Git 提交信息的工具,它可以幫助開發者保持提交信息的規范性和一致性。…

Spark 中RDD、Job,stage,task的關系

目錄 1. 概念定義1.1 Job1.2 Stage1.3 Task 2. 關系總結3. 示例分析代碼示例執行過程 4. Spark中的運行流程5. 關鍵點5.1 寬依賴和窄依賴5.2 并行度5.3 性能優化 **6. 總結****1. RDD的核心作用****1.1 什么是RDD&#xff1f;****1.2 RDD與Job、Stage、Task的關系** **2. Job、…

Kubernetes基礎(三十二):Worker節點啟動全解析

Worker節點是Kubernetes集群的"肌肉"&#xff0c;負責實際運行業務負載。本文將深入剖析Worker節點的完整啟動流程&#xff0c;并揭秘生產環境中的關鍵優化點。 一、啟動流程全景圖 二、核心啟動階段詳解 1. 系統初始化&#xff08;0-30秒&#xff09; 關鍵任務&a…

matlab實現模型預測控制

考慮擴展狀態空間形式 縮寫為 對于未來的預測&#xff0c;這里要注意&#xff0c;默認了最小預測時域為1&#xff0c;如果不為1&#xff0c;從k1到k最小預測時域的x的預測為0 模型預測控制matlab運行代碼&#xff0c;可實現模型預測控制。 StateMPC是按照錢積新版《預測控制》…

Python_day22

DAY 22 復習日 復習日 仔細回顧一下之前21天的內容&#xff0c;沒跟上進度的同學補一下進度。 作業&#xff1a; 自行學習參考如何使用kaggle平臺&#xff0c;寫下使用注意點&#xff0c;并對下述比賽提交代碼 kaggle泰坦里克號人員生還預測 一、Kaggle 基礎使用步驟 注冊與登錄…

【軟件測試】基于項目驅動的功能測試報告(持續更新)

目錄 一、項目的介紹 1.1 項目背景 二、測試目標 2.1 用戶服務模塊 2.1.1 用戶注冊模塊 2.1.1.1 測試點 2.1.1.2 邊界值分析法(等價類+邊界值) 2.1.1.2.1 有效等價類 2.1.1.2.2 無效等價類 2.1.1.2.3 邊界值 2.1.1.2.4 測試用例設計 2.1.2 用戶登錄 2.1.2.1 測試…

QT中多線程的實現

采用官方推薦的 QObject::moveToThread 方式實現&#xff08;相比繼承 QThread 更靈活&#xff09;&#xff0c;包含耗時任務執行、主線程通信、線程安全退出等核心功能。 環境說明 Qt 版本&#xff1a;Qt 5.15 或 Qt 6&#xff08;兼容&#xff09;項目類型&#xff1a;GUI …

從知識圖譜到精準決策:基于MCP的招投標貨物比對溯源系統實踐

前言 從最初對人工智能的懵懂認知&#xff0c;到逐漸踏入Prompt工程的世界&#xff0c;我們一路探索&#xff0c;從私有化部署的實際場景&#xff0c;到對DeepSeek技術的全面解讀&#xff0c;再逐步深入到NL2SQL、知識圖譜構建、RAG知識庫設計&#xff0c;以及ChatBI這些高階應…

maven如何搭建自己的私服(LINUX版)?

環境準備 安裝 JDK &#xff1a;確保系統已安裝 JDK 8 或更高版本。可以通過以下命令安裝 JDK&#xff1a; 安裝 OpenJDK &#xff1a;sudo apt update && sudo apt install openjdk-11-jdk 安裝 Oracle JDK &#xff1a;需要添加第三方倉庫&#xff0c;例如 WebUpd8 …

armv7 backtrace

ref&#xff1a; ARM Cortex-M3/M4/M7 Hardfault異常分析_arm hardfault-CSDN博客

探索 C++23 的 views::cartesian_product

文章目錄 一、背景與動機二、基本概念與語法三、使用示例四、特點與優勢五、性能與優化六、與 P2374R4 的關系七、編譯器支持八、總結 C23 為我們帶來了一系列令人興奮的新特性&#xff0c;其中 views::cartesian_product 是一個非常實用且強大的功能&#xff0c;它允許我們輕…