LeetCode 157,158. Read N Characters Given Read4 I+II

本文详细解析了如何利用仅能读取四个字符的read4函数,实现读取任意指定数量字符的read函数。首先介绍了基本实现思路,随后针对read函数可能被多次调用的情况,提出了一种使用缓存来优化读取过程的方法。
摘要由CSDN通过智能技术生成

Read N Characters Given Read4

这个题目和C里面读文件很像。

read4每次只能读四个字符,把字符放到buf里,返回值是实际读到的字符数。

而我们要做的是用read4实现一个能够读n个字符的函数 read,同样,读到的字符放到buf里。

if (count==0) break; 是处理文件长度比n小的情况。

// Forward declaration of the read4 API.
int read4(char *buf);

class Solution {
public:
    /**
     * @param buf Destination buffer
     * @param n   Maximum number of characters to read
     * @return    The number of characters read
     */
    int read(char *buf, int n) {
        char* tmp=new char[4];
        int len=0;
        while (len<n){
            int count=read4(tmp);
            if (count==0) break;
            int i=0;
            while (len<n && i<count)
                buf[len++] = tmp[i++];
        }
        return len;
    }
};

当然,由于C++指针的缘故,也可以直接read4放到 buf+index 的位置。

 

Read N Characters Given Read4 II - Call multiple times

上一题的followup,其中与上一题有很大的区别。

由于需要多次read,下一次read是紧接在之前读完的字符之后的。这里有一个问题,如果之前read4的字符读多了怎么办?

因此,我们需要一个cache,暂存read4的内容。如果有剩下的,下一次读的时候先把剩下的读了,如果还不够再call read4。

// Forward declaration of the read4 API.
int read4(char *buf);

class Solution {
public:
    /**
     * @param buf Destination buffer
     * @param n   Maximum number of characters to read
     * @return    The number of characters read
     */
    char *cache=new char[4];
    int index=0; // points to the first remaining char
    int count=0; // valid number of characters in cache
    
    int read(char *buf, int n) {
        int len=0;
        while (len<n){
            while (len<n && index<count){
                buf[len++] = cache[index++];
            }
            if (len==n) break;
            
            count=read4(cache);
            if (count==0) break;
            index = 0;
        }
        return len;
    }
};

 

 

References:

https://leetcode.com/problems/read-n-characters-given-read4-ii-call-multiple-times/discuss/141946/My-Concise-c++-solution

转载于:https://www.cnblogs.com/hankunyan/p/9945846.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值