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啊?难道公司配…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...