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

1、题目描述

在这里插入图片描述

2、解题思路

  用一个容量为 4 的数组 fileBuf 存放最近一次 read4 读取到的数据。

  用一个变量 readOffset 指向 fileBuf 尚未使用的开头数据索引。

  用一个变量 bufSize 表示最近一次 read4 读取到的数据字符个数。

  大致算法逻辑如下:

  每次调用 read(char[] buf, int n) 时,都是调用 n 次 getNextCharFromFile()。

  getNextCharFromFile() 逻辑如下:

  当 readOffset < bufSize,说明最近一次读取到 fileBuf 的数据还没用完,从 fileBuf 中取出一个字符,然后 readOffset++;

  当 readOffset == bufSize,说明最近一次 read4 读到的数据已经用完了,于是再调用一次 read4,重置 readOffset 为 0,bufSize = read4(fileBuf)。接着从 fileBuf 拿出一个字符返回出去,readOffset++。

3、解题代码

/**
 * The read4 API is defined in the parent class Reader4.
 *     int read4(char[] buf); 
 */

public class Solution extends Reader4 {
    /**
     * @param buf Destination buffer
     * @param n   Number of characters to read
     * @return    The number of actual characters read
     */
    private char[] fileBuf = new char[4];   // read4 读到的数据存到这里
    private int readOffset = 0; // 指向 fileBuf 尚未使用的开头索引
    private int bufSize = 0;    // 最近一次从 read4 读到的数据有多少个

    public int read(char[] buf, int n) {
        for (int i = 0; i < n; i++) {
            char nextChar = getNextCharFromFile();
            if (nextChar == 0) {
                return i;
            } else {
                buf[i] = nextChar;
            }
        }
        return n;
    }

    public char getNextCharFromFile() {
        // 比如最近一次 read4 读到的有效数据有 2 个,此时 readOffset == 2,说明 fileBuf 已经没有未使用的数据,需要重新 read4
        if (readOffset == bufSize) {
            bufSize = read4(fileBuf);
            readOffset = 0;
            if (bufSize == 0) {
                return 0;
            }
        }
        // readOffset 永远指向尚未读取的数据的最开头
        return fileBuf[readOffset++];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值