当前位置: 首页 > 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;难道公司配…...

HY-MT1.5-1.8B保姆级部署指南:在4090D上快速搭建多语言翻译服务

HY-MT1.5-1.8B保姆级部署指南&#xff1a;在4090D上快速搭建多语言翻译服务 1. 引言 你是否遇到过这样的场景&#xff1a;需要快速翻译大量文档&#xff0c;但担心隐私泄露不敢使用在线服务&#xff1f;或者开发智能硬件产品时&#xff0c;需要内置高质量的离线翻译功能&…...

SDMatte处理动物与宠物图像效果展示:毛发级精度的自然抠图

SDMatte处理动物与宠物图像效果展示&#xff1a;毛发级精度的自然抠图 1. 为什么宠物抠图这么难 给宠物照片抠图可能是设计师最头疼的任务之一。想象一下&#xff0c;一只金毛犬站在浅色地毯上&#xff0c;毛发边缘几乎和背景融为一体&#xff1b;或者一只黑猫蜷缩在深色沙发…...

智能物流分拣破局:越疆协作分拣机器人高效升级指南

在电商、快递行业的高速发展下&#xff0c;物流分拣的压力越来越大&#xff0c;但长期以来&#xff0c;中小物流企业的分拣面临 “两难” 困境&#xff1a;人工分拣招工难、效率低&#xff0c;错分率达 1% 以上&#xff0c;大促期间更是人手不足&#xff1b;而传统的交叉带分拣…...

10-红外接收探头电路设计实战指南

1. 红外接收探头基础入门 第一次接触红外接收探头时&#xff0c;我也被那一堆专业术语搞得晕头转向。其实这东西就像个"红外线翻译官"&#xff0c;专门把遥控器发来的红外光信号转换成电信号。市面上常见的HS0038、LF0038L这些型号&#xff0c;本质上都是将光敏二极…...

用74LS175D和面包板,手把手教你做一个四人抢答器(附完整电路图)

从零搭建四人抢答器&#xff1a;74LS175D芯片实战指南 在电子技术学习过程中&#xff0c;没有什么比亲手搭建一个实际可用的电路更能加深理解了。今天&#xff0c;我们将使用经典的74LS175D芯片&#xff0c;配合面包板、LED和按键开关&#xff0c;一步步构建一个功能完整的四人…...

次元画室快速部署教程:手把手解决网络权限与配置问题

次元画室快速部署教程&#xff1a;手把手解决网络权限与配置问题 1. 环境准备与快速部署 1.1 系统要求检查 在开始部署次元画室前&#xff0c;请确保您的系统满足以下最低要求&#xff1a; 操作系统&#xff1a;Ubuntu 20.04/22.04 LTS 或 CentOS 8/9&#xff08;推荐使用Ub…...

人工智能|大模型 —— 量化 —— 一文搞懂大模型量化技术:GGUF、GPTQ、AWQ

目前关于大模型量化技术的文章层出不穷&#xff0c;但对其理论部分的深入探讨却相对较少。本文将对大模型量化技术进行系统性的介绍&#xff0c;并重点聚焦于理论层面的深入解析。 一、大模型量化基础 大模型量化的核心在于将模型参数的精度从较高的位宽&#xff08;bit-width…...

Obsidian Local Images Plus 插件使用指南

Obsidian Local Images Plus 插件使用指南 【免费下载链接】obsidian-local-images-plus This repo is a reincarnation of obsidian-local-images plugin which main aim was downloading images in md notes to local storage. 项目地址: https://gitcode.com/gh_mirrors/o…...

OpenClaw多设备同步:GLM-4.7-Flash配置共享方案

OpenClaw多设备同步&#xff1a;GLM-4.7-Flash配置共享方案 1. 为什么需要多设备同步配置&#xff1f; 去年冬天&#xff0c;我在办公室和家里两台MacBook上分别部署了OpenClaw对接GLM-4.7-Flash模型。很快发现一个头疼的问题&#xff1a;每次在办公室调试好的技能参数&#…...

Unity卡牌UI框架实战:构建高性能游戏界面的深度策略

Unity卡牌UI框架实战&#xff1a;构建高性能游戏界面的深度策略 【免费下载链接】UiCard Generic UI for card games like Hearthstone, Magic Arena and Slay the Spire... 项目地址: https://gitcode.com/gh_mirrors/ui/UiCard 在卡牌游戏开发领域&#xff0c;UI交互的…...