LeetCode - #158 用 Read4 读取 N 个字符 II


文章目录
- 摘要
- 描述
- 题目描述
- 方法定义
- 题解答案
- 题解代码
- 题解代码分析
- 示例测试及结果
- 示例测试代码
- 示例运行结果
- 时间复杂度
- 空间复杂度
- 总结
- 关于我们
摘要
本文将详细解读一道与文件读取相关的编程问题:如何使用 read4 实现按需读取 n 个字符的 read 方法。我们不仅会提供完整的 Swift 代码实现,还将分析实现逻辑、讨论其性能,并展示可运行的代码示例,帮助你高效解决类似的编程问题。

描述
题目描述
你需要实现一个 read 方法,该方法从文件中读取指定数量的字符 n 并存储到给定的缓存数组 buf 中。实现过程中只能调用提供的 read4 方法。特别地,read 方法可能会被多次调用,你需要保证每次调用都能正确读取字符,同时不能直接操作文件。
方法定义
-
read4 的定义:
func read4(_ buf: inout [Character]) -> Int每次从文件中读取最多 4 个字符到目标缓存
buf中,并返回实际读取的字符数。 -
read 的定义:
func read(_ buf: inout [Character], _ n: Int) -> Int将最多
n个字符从文件中读取到buf中,并返回实际读取的字符数。
题解答案
由于 read 可能被多次调用,我们需要设计一个缓冲机制来存储 read4 多余的字符,以便后续调用可以直接使用这些缓存数据。以下是解决的核心步骤:
- 使用一个类变量缓存从
read4读取的多余字符。 - 每次调用
read时,优先从缓存中获取字符。 - 如果缓存不足,则调用
read4读取更多字符并更新缓存。 - 当文件读取完毕或读取字符达到
n时停止。
题解代码
class Solution {private var buffer: [Character] = [] // 缓存从 read4 读取的多余字符private var bufferPointer = 0 // 缓存指针位置private var bufferSize = 0 // 当前缓存中的字符数量func read4(_ buf: inout [Character]) -> Int {// 模拟 read4 方法return 0 // 此方法由系统实现,用户无需实现此部分}func read(_ buf: inout [Character], _ n: Int) -> Int {var totalRead = 0var tempBuf = [Character](repeating: "\0", count: 4) // 临时缓冲区while totalRead < n {// 如果缓存为空,则调用 read4 填充缓存if bufferPointer == bufferSize {bufferSize = read4(&tempBuf)bufferPointer = 0// 如果 read4 读取到文件末尾,则停止if bufferSize == 0 {break}// 更新缓存buffer = Array(tempBuf[0..<bufferSize])}// 从缓存中读取字符到 bufwhile bufferPointer < bufferSize && totalRead < n {buf.append(buffer[bufferPointer])bufferPointer += 1totalRead += 1}}return totalRead}
}

题解代码分析
-
缓存设计:
- 使用
buffer存储read4多余的字符,bufferPointer跟踪当前缓存读取位置。 - 当缓存为空时,通过
read4填充缓存。
- 使用
-
逻辑流程:
- 优先从缓存中获取字符。
- 如果缓存不足,调用
read4填充并更新缓存。 - 按需将字符从缓存或
read4中拷贝到用户的buf中。
-
多次调用支持:
- 使用类变量
buffer和bufferPointer,确保每次调用read时都能正确处理剩余的缓存数据。
- 使用类变量
示例测试及结果
示例测试代码
// 模拟一个文件内容
let fileContent = "abcdefghijk"
var solution = Solution()// 初始化输出缓存
var outputBuffer: [Character] = []// 调用 read 方法
var result1 = solution.read(&outputBuffer, 4)
print("读取到的字符数:\(result1), 缓存内容:\(String(outputBuffer))")outputBuffer = []
var result2 = solution.read(&outputBuffer, 5)
print("读取到的字符数:\(result2), 缓存内容:\(String(outputBuffer))")outputBuffer = []
var result3 = solution.read(&outputBuffer, 4)
print("读取到的字符数:\(result3), 缓存内容:\(String(outputBuffer))")
示例运行结果
读取到的字符数:4, 缓存内容:abcd
读取到的字符数:5, 缓存内容:efghi
读取到的字符数:2, 缓存内容:jk
时间复杂度
- 读取逻辑:每次调用
read4的复杂度为O(1),在最坏情况下需要调用约n / 4次。 - 总体时间复杂度:
O(n)。
空间复杂度
- 缓存使用:
buffer使用固定大小的数组,最多存储 4 个字符,空间复杂度为O(4)。 - 额外空间:
tempBuf同样固定大小,空间复杂度为O(4)。 - 总体空间复杂度:
O(1)。
总结
本题通过引入缓存机制,巧妙解决了多次调用 read 的问题。代码不仅结构清晰,还保证了性能的稳定性。在实际开发中,这种缓存技术常用于网络流或大文件的分块处理。
希望本文能够帮助你更深入地理解缓存与分块读取的应用场景,并为你在面试或实际项目中提供灵感!
关于我们
我们是由 Swift 爱好者共同维护,我们会分享以 Swift 实战、SwiftUI、Swift 基础为核心的技术内容,也整理收集优秀的学习资料。
相关文章:
LeetCode - #158 用 Read4 读取 N 个字符 II
文章目录 摘要描述题目描述方法定义 题解答案题解代码题解代码分析示例测试及结果示例测试代码示例运行结果 时间复杂度空间复杂度总结关于我们 摘要 本文将详细解读一道与文件读取相关的编程问题:如何使用 read4 实现按需读取 n 个字符的 read 方法。我们不仅会提…...
C++(进阶) 第2章 多态
C(进阶) 第2章 多态 文章目录 前言一、多态的概念二、多态的定义及实现1.虚函数2.虚函数的重写3.多态的条件4.多态的细节 三、析构函数的重写四、重载/重写/隐藏的对比五、抽象类抽象类 六、相关题目题目1题目2 七、const修饰八、多态原理九、虚函数放在地方总结 前…...
mac删除程序坞(Dock)中“无法打开的程序“
参考: Mac删除软件之后图标还在怎么办?https://blog.csdn.net/weixin_46500474/article/details/124284161Mac程序坞中软件删除出现残留“?”图标无法删除解决方法: https://blog.csdn.net/shenwenhao1990/article/details/12865…...
【Linux】vi/vim 使用技巧
文章目录 1. 简介vi和vim的历史vi和vim的区别安装vimUbuntu/DebianCentOS/RHELFedoramacOSWindows 2. 基本操作启动和退出启动退出 模式介绍普通模式插入模式命令模式 光标移动基本移动高级移动 3. 文本编辑插入文本删除文本复制和粘贴撤销和重做 4. 搜索与替换基本搜索搜索文本…...
Python自动化办公(系统维护及开发任务状态自动推送)
Python自动化办公, 1.需求分析 系统维护及开发人员的工作一般都会比较繁杂,领导们喜欢实时掌控项目的进度,但是领导们很多时候是不会自己主动去查看及分析项目进度数据的,干活的牛马们也没空整天日报,周报,月报,季报,年报…活又有了,又该想想怎么干,需求的核心是实现自动整理…...
CentOS7 Apache安装踩坑
Gnome桌面右键弹出终端。 [rootlocalhost ~]# yum repolist 已加载插件:fastestmirror, langpacks /var/run/yum.pid 已被锁定,PID 为 2611 的另一个程序正在运行。 Another app is currently holding the yum lock; waiting for it to exit... [root…...
OpenMMlab导出MaskFormer/Mask2Former模型并用onnxruntime和tensorrt推理
onnxruntime推理 使用mmdeploy导出onnx模型: from mmdeploy.apis import torch2onnx from mmdeploy.backend.sdk.export_info import export2SDK# img ./bus.jpg # work_dir ./work_dir/onnx/maskformer # save_file ./end2end.onnx # deploy_cfg ./configs/m…...
若依微服务中配置 MySQL + DM 多数据源
文章目录 1、导入 MySQL 和达梦(DM)依赖2、在 application-druid.yml 中配置达梦(DM)数据源3、在 DruidConfig 类中配置多数据源信息4、在 Service 层或方法级别切换数据源4.1 在 Service 类上切换到从库数据源4.2 在方法级别切换…...
一些前端组件介绍
wangEditor : 一款开源 Web 富文本编辑器,可用于 jQuery Vue React等 https://www.wangeditor.com/ Handsontable:一款前端可编辑电子表格https://blog.csdn.net/carcarrot/article/details/108492356mitt:Mitt 是一个在 Vue.js 应…...
python学opencv|读取图像(九)用numpy创建黑白相间灰度图
【1】引言 前述学习过程中,掌握了用numpy创建矩阵数据,把所有像素点的BGR取值设置为0,然后创建纯黑灰度图的方法,具体链接为: python学opencv|读取图像(八)用numpy创建纯黑灰度图-CSDN博客 在…...
AtCoder Beginner Contest 383
C - Humidifier 3 Description 一个 h w h \times w hw 的网格,每个格子可能是墙、空地或者城堡。 一个格子是好的,当且仅当从至少一个城堡出发,走不超过 d d d 步能到达。(只能上下左右走,不能穿墙)&…...
20. 内置模块
一、random模块 random 模块用来创建随机数的模块。 random.random() # 随机生成一个大于0且小于1之间的小数 random.randint(a, b) # 随机生成一个大于等于a小于等于b的随机整数 random.uniform(a, b) …...
《知识拓展 · 统一建模语言UML》
📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…...
计算机网络-Wireshark探索ARP
使用工具 Wiresharkarp: To inspect and clear the cache used by the ARP protocol on your computer.curl(MacOS)ifconfig(MacOS or Linux): to inspect the state of your computer’s network interface.route/netstat: To inspect the routes used by your computer.Brows…...
减少30%人工处理时间,AI OCR与表格识别助力医疗化验单快速处理
在医疗行业,化验单作为重要的诊断依据和数据来源,涉及大量的文字和表格信息,传统的手工输入和数据处理方式不仅繁琐,而且容易出错,给医院的运营效率和数据准确性带来较大挑战。随着人工智能技术的快速发展,…...
1.2.3计算机软件
一个完整的计算机系统由硬件和软件组成,用户使用软件,而软件运行在硬件之上,软件进一步的划分为两类:应用软件和系统软件。普通用户通常只会跟应用软件打交道。应用软件是为了解决用户的某种特定的需求而研发出来的。除了每个人都…...
二、uni-forms
避坑指南:uni-forms表单在uni-app中的实践经验-CSDN博客...
Android13开机向导
文章目录 前言需求-场景第三方资料说明需求思路按照平台 思路 从配置上去 feature换个思路,去feature。SimMissingActivity 判断跳过逻辑SetupWizardUtils 判断SIM 、 hasSystemFeature FEATURE_TELEPHONYPackageManager.FEATURE_TELEPHONYApplicationPackageManage…...
软件测试丨Appium 源码分析与定制
在本文中,我们将深入Appium的源码,探索它的底层架构、定制化使用方法和给软件测试带来的优势。我们将详细介绍这些技术如何解决实际问题,并与大家分享一些实用的案例,以帮助读者更好地理解和应用这一技术。 Appium简介 什么是App…...
1.网络知识-IP与子网掩码的关系及计算实例
IP与子网掩码 说实话,之前没有注意过,今天我打开自己的办公地电脑,看到我的网络配置如下: 我看到我的子网掩码是255.255.254.0,我就奇怪了,我经常见到的子网掩码都是255.255.255.0啊?难道公司配…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
