博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] Read N Characters Given Read4 II - Call multiple times 用Read4来读取N个字符之二 - 多次调用...
阅读量:5282 次
发布时间:2019-06-14

本文共 1807 字,大约阅读时间需要 6 分钟。

 

The API: int read4(char *buf) reads 4 characters at a time from a file.

The return value is the actual number of characters read. For example, it returns 3 if there is only 3 characters left in the file.

By using the read4 API, implement the function int read(char *buf, int n) that reads n characters from the file.

Note:

The read function may be called multiple times.

 

这道题是之前那道的拓展,那道题说read函数只能调用一次,而这道题说read函数可以调用多次,那么难度就增加了,为了更简单直观的说明问题,我们举个简单的例子吧,比如:

buf = "ab", [read(1),read(2)],返回 ["a","b"]

那么第一次调用read(1)后,从buf中读出一个字符,那么就是第一个字符a,然后又调用了一个read(2),想取出两个字符,但是buf中只剩一个b了,所以就把取出的结果就是b。再来看一个例子:

buf = "a", [read(0),read(1),read(2)],返回 ["","a",""]

第一次调用read(0),不取任何字符,返回空,第二次调用read(1),取一个字符,buf中只有一个字符,取出为a,然后再调用read(2),想取出两个字符,但是buf中没有字符了,所以取出为空。

但是这道题我不太懂的地方是明明函数返回的是int类型啊,为啥OJ的output都是vector<char>类的,然后我就在网上找了下面两种能通过OJ的解法,大概看了看,也是看的个一知半解,貌似是用两个变量readPos和writePos来记录读取和写的位置,i从0到n开始循环,如果此时读和写的位置相同,那么我们调用read4函数,将结果赋给writePos,把readPos置零,如果writePos为零的话,说明buf中没有东西了,返回当前的坐标i。然后我们用内置的buff变量的readPos位置覆盖输入字符串buf的i位置,如果完成遍历,返回n,参见代码如下:

 

解法一:

class Solution {public:    int read(char *buf, int n) {        for (int i = 0; i < n; ++i) {            if (readPos == writePos) {                writePos = read4(buff);                readPos = 0;                if (writePos == 0) return i;            }            buf[i] = buff[readPos++];        }        return n;    }private:    int readPos = 0, writePos = 0;    char buff[4];};

 

下面这种方法和上面的方法基本相同,稍稍改变了些解法,使得看起来更加简洁一些:

 

解法二:

class Solution {public:    int read(char *buf, int n) {        int i = 0;        while (i < n && (readPos < writePos || (readPos = 0) < (writePos = read4(buff))))            buf[i++] = buff[readPos++];        return i;    }    char buff[4];    int readPos = 0, writePos = 0;};

 

类似题目:

 

参考资料:

 

转载于:https://www.cnblogs.com/grandyang/p/5181672.html

你可能感兴趣的文章
防抖节流
查看>>
URL结构
查看>>
C#-WinForm-设计时编程【4】-响应鼠标事件
查看>>
深入Nginx
查看>>
[LeetCode] Reverse Linked List II
查看>>
ping不通的常见原因和解决办法
查看>>
AIX下绑定双网卡
查看>>
[POJ1113&POJ1696]凸包卷包裹算法和Graham扫描法应用各一例
查看>>
使用Java提供的MXBean来监控jvm创建了哪些线程
查看>>
busy monkey
查看>>
gcc 使用注意事项
查看>>
Tomcat启动时项目重复加载问题
查看>>
判断当前时间是否在一个时间段范围内
查看>>
《软件需求模式》阅读笔记02
查看>>
感知机
查看>>
php后门隐藏技巧
查看>>
SpringBoot使用Gradle构建war包
查看>>
Python基础学习(四)
查看>>
ref out
查看>>
Sklearn-CrossValidation交叉验证
查看>>