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

LeetCode 付费题157. 用 Read4 读取 N 个字符解题思路

问题描述

实现一个 read 方法,通过给定的 read4 API 从文件中读取最多 n 个字符到目标缓冲区 buf 中。read4 每次从文件读取最多4个字符到临时缓冲区。

核心思路
  1. 循环读取机制
    • 通过多次调用 read4 分批读取数据
    • 每次读取后,将临时缓冲区的数据复制到目标缓冲区
    • 重复直到满足以下任一条件:
      • 读取字符数达到 n
      • 文件读取完毕(read4 返回0)
  2. 关键变量
    • idx:记录已复制到 buf 的字符数(目标缓冲区索引)
    • tmpBuf:临时缓冲区(固定大小4),存储 read4 的返回结果
    • cnt:每次 read4 实际读取的字符数(0~4)
算法步骤
  1. 初始化

    • 目标缓冲区索引 idx = 0
    • 创建临时缓冲区 tmpBuf = new char[4]
  2. 循环读取

    while (idx < n) {int cnt = read4(tmpBuf);  // 读取最多4个字符if (cnt == 0) break;      // 文件结束// 复制数据到目标缓冲区for (int i = 0; i < cnt; i++) {buf[idx + i] = tmpBuf[i];}idx += cnt;  // 更新已复制字符数
    }
    
  3. 返回结果

    • 实际读取字符数为 min(idx, n)
    • 文件结束但未读满 n 时,返回实际读取量
边界处理
  • 文件不足 n 字符:当 read4 返回0时提前终止循环
  • 读取超 n 字符:通过 idx < n 循环条件控制
  • 缓冲区溢出防护Math.min(idx, n) 确保返回值不超过 n
复杂度分析
  1. 时间复杂度
    • 循环次数:O(⌈n/4⌉)
    • 字符复制:O(n)
    • 总时间复杂度O(n)
  2. 空间复杂度
    • 临时缓冲区 tmpBufO(4) = O(1)
    • 总空间复杂度O(1)
示例说明

假设文件内容为 "abcdef"n=5

  1. 第一次 read4tmpBuf="abcd", cnt=4
    • 复制到 buf[0:3], idx=4
  2. 第二次 read4tmpBuf="ef", cnt=2
    • 复制到 buf[4:5], idx=6
  3. 返回 min(6,5)=5buf="abcde"
适用场景
  • 需要从流中分批读取数据的场景
  • 目标缓冲区大小受限时
  • 文件大小未知的情况(自动处理文件结束)

注:此解法严格遵循题目要求,高效处理字符读取和缓冲区管理,时间和空间复杂度均为最优。

完整代码
public class Solution extends Reader4 {/*** @param buf Destination buffer* @param n   Number of characters to read* @return    The number of actual characters read*/public int read(char[] buf, int n) {int idx = 0;char[] tmpBuf = new char[4];while (idx < n) {int cnt = read4(tmpBuf);if (cnt == 0) break;for (int i = 0; i < cnt; i++) buf[idx + i] = tmpBuf[i];idx += cnt;}return Math.min(idx, n);}
}
http://www.xdnf.cn/news/10572.html

相关文章:

  • deep forest安装及使用教程
  • 强大的PDF编辑工具,操作方便 ,长久使用
  • 第1天:认识RNN及RNN初步实验(预测下一个数字)
  • 【C盘瘦身】Docker安装目录占用C盘过大,一键移动给C盘瘦身
  • 大数据-275 Spark MLib - 基础介绍 机器学习算法 集成学习 随机森林 Bagging Boosting
  • 8、电解电容—数据手册解读
  • Unity使用Lua框架和C#框架开发游戏的区别
  • 2022年上半年软件设计师下午试题
  • 6月2日星期一今日早报简报微语报早读
  • 知识图谱系列(5):表示学习
  • 内网应用如何实现外网访问?无公网IP本地端口网址服务提供互联网连接
  • HCIP:MPLS LDP的原理和配置
  • Go开发简历优化指南
  • AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年6月2日第96弹
  • 高压电绝缘子破损目标检测数据集简介与应用
  • MDP的curriculums部分
  • GNOME开始菜单
  • gcc编译构建流程-动态链接库
  • YOLO机械臂丨使用unity搭建仿真环境,YOLO算法识别,Moveit2控制
  • 残差神经网络ResNet
  • Webpack依赖
  • 前端面试准备-6
  • unity随机生成未知符号教程
  • 字节跳动社招面经 —— BSP驱动工程师(5)
  • webfuture:如何屏蔽后台发文界面的保存为新文章按钮?
  • 使用 fastai 进行文本分类的简明指南 - Fastai Part 5
  • 【仿muduo库实现并发服务器】使用正则表达式提取HTTP元素
  • java基础学习(二十一)
  • oscp练习 PG Wombo
  • 「完整」AI文档库 | 5月20最新发布,221页,《北京大学AI+Agent与Agentic+AI的原理和应用洞察与未来展望》