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

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 多余的字符,以便后续调用可以直接使用这些缓存数据。以下是解决的核心步骤:

  1. 使用一个类变量缓存从 read4 读取的多余字符。
  2. 每次调用 read 时,优先从缓存中获取字符。
  3. 如果缓存不足,则调用 read4 读取更多字符并更新缓存。
  4. 当文件读取完毕或读取字符达到 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}
}

题解代码分析

  1. 缓存设计

    • 使用 buffer 存储 read4 多余的字符,bufferPointer 跟踪当前缓存读取位置。
    • 当缓存为空时,通过 read4 填充缓存。
  2. 逻辑流程

    • 优先从缓存中获取字符。
    • 如果缓存不足,调用 read4 填充并更新缓存。
    • 按需将字符从缓存或 read4 中拷贝到用户的 buf 中。
  3. 多次调用支持

    • 使用类变量 bufferbufferPointer,确保每次调用 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

文章目录 摘要描述题目描述方法定义 题解答案题解代码题解代码分析示例测试及结果示例测试代码示例运行结果 时间复杂度空间复杂度总结关于我们 摘要 本文将详细解读一道与文件读取相关的编程问题&#xff1a;如何使用 read4 实现按需读取 n 个字符的 read 方法。我们不仅会提…...

C++(进阶) 第2章 多态

C&#xff08;进阶) 第2章 多态 文章目录 前言一、多态的概念二、多态的定义及实现1.虚函数2.虚函数的重写3.多态的条件4.多态的细节 三、析构函数的重写四、重载/重写/隐藏的对比五、抽象类抽象类 六、相关题目题目1题目2 七、const修饰八、多态原理九、虚函数放在地方总结 前…...

mac删除程序坞(Dock)中“无法打开的程序“

参考&#xff1a; Mac删除软件之后图标还在怎么办&#xff1f;https://blog.csdn.net/weixin_46500474/article/details/124284161Mac程序坞中软件删除出现残留“&#xff1f;”图标无法删除解决方法&#xff1a; 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 已加载插件&#xff1a;fastestmirror, langpacks /var/run/yum.pid 已被锁定&#xff0c;PID 为 2611 的另一个程序正在运行。 Another app is currently holding the yum lock; waiting for it to exit... [root…...

OpenMMlab导出MaskFormer/Mask2Former模型并用onnxruntime和tensorrt推理

onnxruntime推理 使用mmdeploy导出onnx模型&#xff1a; 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 和达梦&#xff08;DM&#xff09;依赖2、在 application-druid.yml 中配置达梦&#xff08;DM&#xff09;数据源3、在 DruidConfig 类中配置多数据源信息4、在 Service 层或方法级别切换数据源4.1 在 Service 类上切换到从库数据源4.2 在方法级别切换…...

一些前端组件介绍

wangEditor &#xff1a; 一款开源 Web 富文本编辑器&#xff0c;可用于 jQuery Vue React等 https://www.wangeditor.com/ Handsontable&#xff1a;一款前端可编辑电子表格https://blog.csdn.net/carcarrot/article/details/108492356mitt&#xff1a;Mitt 是一个在 Vue.js 应…...

python学opencv|读取图像(九)用numpy创建黑白相间灰度图

【1】引言 前述学习过程中&#xff0c;掌握了用numpy创建矩阵数据&#xff0c;把所有像素点的BGR取值设置为0&#xff0c;然后创建纯黑灰度图的方法&#xff0c;具体链接为&#xff1a; python学opencv|读取图像&#xff08;八&#xff09;用numpy创建纯黑灰度图-CSDN博客 在…...

AtCoder Beginner Contest 383

C - Humidifier 3 Description 一个 h w h \times w hw 的网格&#xff0c;每个格子可能是墙、空地或者城堡。 一个格子是好的&#xff0c;当且仅当从至少一个城堡出发&#xff0c;走不超过 d d d 步能到达。&#xff08;只能上下左右走&#xff0c;不能穿墙&#xff09;&…...

20. 内置模块

一、random模块 random 模块用来创建随机数的模块。 random.random() # 随机生成一个大于0且小于1之间的小数 random.randint(a, b) # 随机生成一个大于等于a小于等于b的随机整数 random.uniform(a, b) …...

《知识拓展 · 统一建模语言UML》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…...

计算机网络-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与表格识别助力医疗化验单快速处理

在医疗行业&#xff0c;化验单作为重要的诊断依据和数据来源&#xff0c;涉及大量的文字和表格信息&#xff0c;传统的手工输入和数据处理方式不仅繁琐&#xff0c;而且容易出错&#xff0c;给医院的运营效率和数据准确性带来较大挑战。随着人工智能技术的快速发展&#xff0c;…...

1.2.3计算机软件

一个完整的计算机系统由硬件和软件组成&#xff0c;用户使用软件&#xff0c;而软件运行在硬件之上&#xff0c;软件进一步的划分为两类&#xff1a;应用软件和系统软件。普通用户通常只会跟应用软件打交道。应用软件是为了解决用户的某种特定的需求而研发出来的。除了每个人都…...

二、uni-forms

避坑指南&#xff1a;uni-forms表单在uni-app中的实践经验-CSDN博客...

Android13开机向导

文章目录 前言需求-场景第三方资料说明需求思路按照平台 思路 从配置上去 feature换个思路&#xff0c;去feature。SimMissingActivity 判断跳过逻辑SetupWizardUtils 判断SIM 、 hasSystemFeature FEATURE_TELEPHONYPackageManager.FEATURE_TELEPHONYApplicationPackageManage…...

软件测试丨Appium 源码分析与定制

在本文中&#xff0c;我们将深入Appium的源码&#xff0c;探索它的底层架构、定制化使用方法和给软件测试带来的优势。我们将详细介绍这些技术如何解决实际问题&#xff0c;并与大家分享一些实用的案例&#xff0c;以帮助读者更好地理解和应用这一技术。 Appium简介 什么是App…...

1.网络知识-IP与子网掩码的关系及计算实例

IP与子网掩码 说实话&#xff0c;之前没有注意过&#xff0c;今天我打开自己的办公地电脑&#xff0c;看到我的网络配置如下&#xff1a; 我看到我的子网掩码是255.255.254.0&#xff0c;我就奇怪了&#xff0c;我经常见到的子网掩码都是255.255.255.0啊&#xff1f;难道公司配…...

校企合作奖学金与实习计划:破解半导体硬件人才困境的务实路径

1. 行业人才困境的根源与一个被忽视的解法最近和几位在半导体、硬件设计领域摸爬滚打了十几年的老朋友聊天&#xff0c;话题不出意外地又绕回了“招人难”。从深圳的硬件创业公司&#xff0c;到上海的外企研发中心&#xff0c;再到西安的老牌研究所&#xff0c;几乎所有人都在抱…...

Windows 平台 OpenClaw 2.7.1 可视化安装避坑技巧与高效配置方法

OpenClaw 2.7.1 Windows 一键部署教程&#xff5c;3 分钟快速搭建本地 AI 智能助手OpenClaw&#xff08;小龙虾&#xff09;是一款实用性极强的本地 AI 智能体工具&#xff0c;适配全系 Windows 系统。软件依托自然语言交互逻辑&#xff0c;可智能完成电脑操控、文件分类管理、…...

为什么需要做GEO优化?AI新时代的商业规则探索

2026年&#xff0c;一个加速蔓延的商业现象正在发生&#xff1a;消费者不再打开搜索引擎、翻阅列表、逐条点击蓝色链接——他们直接打开DeepSeek、豆包、Kimi等AI助手&#xff0c;用一句完整的话发起提问&#xff1a;“这个价位哪个品牌最值得买&#xff1f;”“敏感肌用什么护…...

Spring AI ChatMemory 对话记忆配置JDBC方式到Mysql数据库实战示例与原理讲解

场景 Spring AI ChatMemory 对话记忆配置指南&#xff1a;概念、实战与常见问题&#xff1a; https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/161020514 上述示例对话记忆使用内存方式&#xff0c;如何使用JDBC方式将对话记忆到Mysql中。 之前我们使用的 InMe…...

微信QQ防撤回终极指南:3分钟学会永久保留聊天记录

微信QQ防撤回终极指南&#xff1a;3分钟学会永久保留聊天记录 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目地址: https://gitcode.com/Gi…...

华为MateBook D 2018款升级Win11遇阻?手把手教你通过修改BIOS隐藏参数开启TPM2.0

华为MateBook D 2018款解锁Win11升级全攻略&#xff1a;深入BIOS底层参数调整实战 华为MateBook D系列作为商务本中的性价比代表&#xff0c;2018款用户近期在升级Windows 11时普遍遇到TPM 2.0无法启用的困扰。这台搭载第八代Intel处理器的设备其实完全具备TPM 2.0的硬件基础&a…...

极域电子教室破解终极指南:5步重获电脑控制权

极域电子教室破解终极指南&#xff1a;5步重获电脑控制权 【免费下载链接】JiYuTrainer 极域电子教室防控制软件, StudenMain.exe 破解 项目地址: https://gitcode.com/gh_mirrors/ji/JiYuTrainer 你是否曾在上机课时被极域电子教室的全屏广播困住&#xff0c;想要操作电…...

告别‘玄学’:用Python从零实现一个能纠3个错的BCH码(附完整代码)

告别‘玄学’&#xff1a;用Python从零实现一个能纠3个错的BCH码&#xff08;附完整代码&#xff09; 在数字通信系统中&#xff0c;错误控制编码是确保数据可靠传输的核心技术之一。BCH码作为一种强大的循环码&#xff0c;不仅能检测错误&#xff0c;还能纠正多个随机错误&…...

MATLAB程序打包成exe后,发给没有MATLAB的同事/客户怎么用?完整部署指南

MATLAB程序打包成EXE后的完整部署指南&#xff1a;让无MATLAB环境的用户也能顺畅运行 当你花费数周时间在MATLAB中打磨出一个完美的算法工具&#xff0c;最终通过mcc命令将其打包成.exe文件时&#xff0c;那种成就感无与伦比。但现实往往给你当头一棒——同事或客户双击这个exe…...

开源短剧源码|短剧小程序源码短剧App源码双端适配,即开即用

在当下这个注意力稀缺的时代&#xff0c;短剧以其“爽点密集、节奏明快、情感代入强”的特点&#xff0c;迅速抢占了海量用户的碎片化时间。无论是国内的微信/抖音小程序生态&#xff0c;还是出海的短剧App市场&#xff0c;都呈现出爆发式的增长态势。然而&#xff0c;对于想要…...