LeetCode第158題_用Read4讀取N個字符 II

LeetCode 第158題:用Read4讀取N個字符 II

題目描述

給你一個文件,并且該文件只能通過給定的 read4 方法來讀取,請實現一個方法來讀取 n 個字符。

read4 方法:

  • API read4 可以從文件中讀取 4 個連續的字符,并且將它們寫入緩存數組 buf 中。
  • 返回值為實際讀取的字符個數。

注意:read4() 有自己的文件指針,就像 C 語言中的 FILE *fp 一樣。

難度

困難

題目鏈接

點擊在LeetCode中查看題目

示例

示例 1:

輸入: file = "abc", n = 4
輸出: 3
解釋: 當執行你的 read 方法后,buf 需要包含 "abc"。 文件一共 3 個字符,因此返回 3。 注意 "abc" 是文件的內容,不是 buf 的內容。

示例 2:

輸入: file = "abcde", n = 5
輸出: 5
解釋: 當執行你的 read 方法后,buf 需要包含 "abcde"。文件共 5 個字符,因此返回 5。

示例 3:

輸入: file = "abcdABCD1234", n = 12
輸出: 12
解釋: 當執行你的 read 方法后,buf 需要包含 "abcdABCD1234"。文件一共 12 個字符,因此返回 12。

示例 4:

輸入: file = "leetcode", n = 5
輸出: 5
解釋: 當執行你的 read 方法后,buf 需要包含 "leetc"。文件中一共 5 個字符,因此返回 5。

提示

  • 1 <= file.length <= 500
  • n >= 1
  • 你 不能 直接操作該文件,只能通過 get 方法來獲取文件內容。
  • 請 不要 修改輸出結果數組。
  • 假定所有字符都是 ASCII 碼表中的字符。

解題思路

方法:隊列

使用隊列存儲未使用的字符。
關鍵點:

  1. 使用隊列存儲read4讀取的未使用字符
  2. 當隊列為空時,使用read4讀取新的字符
  3. 從隊列中取出字符直到達到目標字符數或隊列為空
  4. 處理邊界情況
  5. 返回實際讀取的字符數

時間復雜度:O(n),其中n是要讀取的字符數。
空間復雜度:O(1),只需要固定大小的隊列。

代碼實現

C# 實現

public class Solution {private Queue<char> queue = new Queue<char>();public int Read(char[] buf, int n) {int total = 0;char[] temp = new char[4];while (total < n) {if (queue.Count == 0) {int count = Read4(temp);if (count == 0) break;for (int i = 0; i < count; i++) {queue.Enqueue(temp[i]);}}if (queue.Count == 0) break;buf[total++] = queue.Dequeue();}return total;}
}

Python 實現

class Solution:def __init__(self):self.queue = []def read(self, buf: List[str], n: int) -> int:total = 0temp = [None] * 4while total < n:if not self.queue:count = read4(temp)if count == 0:breakself.queue.extend(temp[:count])if not self.queue:breakbuf[total] = self.queue.pop(0)total += 1return total

C++ 實現

class Solution {
private:queue<char> q;public:int read(char *buf, int n) {int total = 0;char temp[4];while (total < n) {if (q.empty()) {int count = read4(temp);if (count == 0) break;for (int i = 0; i < count; i++) {q.push(temp[i]);}}if (q.empty()) break;buf[total++] = q.front();q.pop();}return total;}
};

性能分析

各語言實現的性能對比:

實現語言執行用時內存消耗特點
C#92 ms38.2 MB實現簡潔,性能適中
Python156 ms16.8 MB代碼最簡潔
C++24 ms9.6 MB性能最優

補充說明

代碼亮點

  1. 使用隊列存儲未使用的字符
  2. 處理了各種邊界情況
  3. 代碼結構清晰,易于維護

常見錯誤

  1. 沒有處理文件結束的情況
  2. 沒有處理n大于文件長度的情況
  3. 隊列為空時的處理不當

相關題目

  • 157. 用Read4讀取N個字符
  • 68. 文本左右對齊
  • 43. 字符串相乘

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

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

相關文章

算法篇之單調棧

單調棧算法入門 單調棧是一種特殊的數據結構應用&#xff0c;它的核心在于維護一個棧&#xff0c;使得棧內元素保持單調遞增或者單調遞減的順序。這種數據結構在解決很多算法問題時非常有效&#xff0c;例如求數組中每個元素的下一個更大元素、每日溫度問題等。 一、單調棧的…

Kubernetes控制平面組件:調度器Scheduler(二)

云原生學習路線導航頁&#xff08;持續更新中&#xff09; kubernetes學習系列快捷鏈接 Kubernetes架構原則和對象設計&#xff08;一&#xff09;Kubernetes架構原則和對象設計&#xff08;二&#xff09;Kubernetes架構原則和對象設計&#xff08;三&#xff09;Kubernetes控…

【網絡】數據鏈路層知識梳理

全是通俗易懂的講解&#xff0c;如果你本節之前的知識都掌握清楚&#xff0c;那就速速來看我的筆記吧~ 自己寫自己的八股&#xff01;讓未來的自己看懂&#xff01; &#xff08;全文手敲&#xff0c;受益良多&#xff09; 數據鏈路層 我們來重新理解一下這個圖&#xff1a;…

機器學習(神經網絡基礎篇)——個人理解篇6(概念+代碼)

1 在聲明一個類中&#xff0c;構建一個屬于類的函數&#xff0c;前面為什要加上“self”&#xff1f; 就像下面這一串代碼&#xff1a; class TwoLayerNet:def __init__(self, input_size, hidden_size, output_size,weight_init_std0.01):# 初始化權重self.params {}self.p…

Cribl 對Windows-xml log 進行 -Removing filed-06

Removing Fields Description? The Eval Function can be used to add or remove fields. In this example we will remove the extracted fields while preserving _raw, _time,index,source, sourcetype. Steps - Adding an Eval Function

chili3d調試6 添加左側面板

注釋前 一個一個注釋看對應哪個窗口 無事發生 子方法不是顯示的窗口 注釋掉看看 沒了 注釋這個看看 零件頁面沒了 這個瀏覽器居然完全不用關的&#xff0c;刷新就重載了 注釋看看 無工具欄版本 sidebar&#xff1a; 往框框里面加入 div({ className: style.input }, user_…

Linux學習——了解和熟悉Linux系統的遠程終端登錄

Linux學習——了解和熟悉Linux系統的遠程終端登錄 一.配置Ubuntu系統的網絡和用戶 1、設置虛擬機網絡為橋接模式 打開VMWare&#xff0c;選擇編輯虛擬機設置&#xff0c;在網絡適配器設置中&#xff0c;選擇“橋接模式”&#xff0c;保存設置并啟動Ubuntu。 2、配置Ubuntu的…

【JAVA EE初階】多線程(1)

這樣的代碼&#xff0c;雖然也能打印hello thread&#xff0c;但是沒有創建新的線程&#xff0c;而是直接在main方法所在的主線程中執行了run的邏輯 start方法&#xff0c;是調用系統api&#xff0c;真正在操作系統內部創建一個線程。這個新的線程會以run作為入口方法&#xff…

javase 學習

一、Java 三大版本 javaSE 標準版 &#xff08;桌面程序&#xff1b; 控制臺開發&#xff09; javaME 嵌入式開發&#xff08;手機、小家電&#xff09;基本不用&#xff0c;已經淘汰了 javaEE E業級發開&#xff08;web端、 服務器開發&#xff09; 二、Jdk ,jre jvm 三…

【Linux】Linux 操作系統 - 05 , 軟件包管理器和 vim 編輯器的使用 !

文章目錄 前言一、軟件包管理器1 . 軟件安裝2 . 包管理器3 . Linux 生態 二、軟件安裝 、卸載三、vim 的使用1 . 什么是 vim ?2 . vim 多模式3 . 命令模式 - 命令4 . 底行模式 - 命令5. 插入模式6 . 替換模式7 . V-BLOCK 模式8 . 技巧補充 總結 前言 本篇筆者將會對軟件包管理…

python基礎知識點(1)

python語句 一行寫一條語句 一行內寫多行語句&#xff0c;使用分號分隔建議每行寫一句&#xff0c;且結束時不寫分號寫在[ ]、{ }內的跨行語句&#xff0c;被視為一行語句\ 是續行符,實現分行書寫功能 反斜杠表示下一行和本行是同一行 代碼塊與縮進 代碼塊復合語句&#xf…

C#/.NET/.NET Core技術前沿周刊 | 第 35 期(2025年4.14-4.20)

前言 C#/.NET/.NET Core技術前沿周刊&#xff0c;你的每周技術指南針&#xff01;記錄、追蹤C#/.NET/.NET Core領域、生態的每周最新、最實用、最有價值的技術文章、社區動態、優質項目和學習資源等。讓你時刻站在技術前沿&#xff0c;助力技術成長與視野拓寬。 歡迎投稿、推薦…

HTML表單與數據驗證設計

HTML 表單與數據驗證設計&#xff1a;構建可靠的用戶數據采集系統 引言 互聯網的核心是數據交互&#xff0c;而HTML表單是這一交互的主要入口。作為前端工程師&#xff0c;設計高質量的表單不僅關乎用戶體驗&#xff0c;更直接影響數據收集的準確性和系統安全。 在我的學習實…

基于STM32的Keil環境搭建與點燈

本人使用的STM32開發板為正點原子的STM32F103ZE&#xff0c;在此記錄完整的搭建與點燈過程。 一、Keil的安裝與配置 安裝Keil 首先進入Keil下載官網&#xff1a;https://www.keil.com/download/product/ 點擊MDK-ARM&#xff0c;并填寫相關信息&#xff0c;之后開始下載最新版…

React-useRef

如果我們想在hooks里面獲同步取最新的值&#xff0c;那么則可以使用useRef, 關鍵源碼如下&#xff1a; function mountRef<T>(initialValue: T): {|current: T|} {const hook mountWorkInProgressHook();const ref {current: initialValue};hook.memoizedState ref;re…

幽靈依賴與常見依賴管理

文章目錄 前言1. 演示&#xff1a;檢測和修復幽靈依賴步驟1&#xff1a;安裝 depcheck步驟2&#xff1a;在項目根目錄運行 depcheck可能的輸出步驟3&#xff1a;修復幽靈依賴 2. 依賴管理的好習慣 1. 場景設定現在有如下依賴需求&#xff1a; 2. 依賴沖突的表現3. 解決依賴沖突…

如何使用人工智能大模型,免費快速寫工作總結?

如何使用人工智能大模型&#xff0c;免費快速寫工作總結&#xff1f; 詳細學習視頻https://edu.csdn.net/learn/40406/666581

[Java實戰經驗]異常處理最佳實踐

一些好的異常處理實踐。 目錄 異常設計自定義異常為異常設計錯誤代碼&#xff08;狀態碼&#xff09;設計粒度全局異常處理異常日志信息保留 異常處理時機資源管理try-with-resources異常中的事務 異常設計 自定義異常 自定義異常設計&#xff0c;如業務異常定義BusinessExce…

Makefile 入門指南

Makefile 入門指南 最簡單的例子 單文件編譯 假設我們有一個main.cpp文件&#xff0c;最簡單的Makefile如下&#xff1a; # 最簡單的單文件編譯 # 目標:依賴文件 main: main.cpp# 編譯命令g main.cpp -o main使用步驟&#xff1a; 將上述內容保存為名為Makefile的文件&…

PyTorch數據操作基礎教程:從張量創建到高級運算

本文通過示例代碼全面講解PyTorch中張量的基本操作&#xff0c;包含創建、運算、廣播機制、索引切片等核心功能&#xff0c;并提供完整的代碼和輸出結果。 1. 張量創建與基本屬性 import torch# 創建連續數值張量 x torch.arange(12, dtypetorch.float32) print("原始張…