[LeetCode] Read N Characters Given Read4 II - Call multiple times 用Read4来读取N个字符之二 - 多次调用
Given a file and assume that you can only read the file using a given method read4
, implement a method read
to read n characters. Your method read
may be called multiple times.
Method read4:
The API read4
reads 4 consecutive characters from the file, then writes those characters into the buffer array buf
.
The return value is the number of actual characters read.
Note that read4()
has its own file pointer, much like FILE *fp
in C.
Definition of read4:
Parameter: char[] buf
Returns: int Note: buf[] is destination not source, the results from read4 will be copied to buf[]
Below is a high level example of how read4
works:
File file("abcdefghijk"); // File is "abcdefghijk", initially file pointer (fp) points to 'a'
char[] buf = new char[4]; // Create buffer with enough space to store characters
read4(buf); // read4 returns 4. Now buf = "abcd", fp points to 'e'
read4(buf); // read4 returns 4. Now buf = "efgh", fp points to 'i'
read4(buf); // read4 returns 3. Now buf = "ijk", fp points to end of file
Method read:
By using the read4
method, implement the method read
that reads n characters from the file and store it in the buffer array buf
. Consider that you cannot manipulate the file directly.
The return value is the number of actual characters read.
Definition of read:
Parameters: char[] buf, int n
Returns: int Note: buf[] is destination not source, you will need to write the results to buf[]
Example 1:
File file("abc");
Solution sol;
// Assume buf is allocated and guaranteed to have enough space for storing all characters from the file.
sol.read(buf, 1); // After calling your read method, buf should contain "a". We read a total of 1 character from the file, so return 1.
sol.read(buf, 2); // Now buf should contain "bc". We read a total of 2 characters from the file, so return 2.
sol.read(buf, 1); // We have reached the end of file, no more characters can be read. So return 0.
Example 2:
File file("abc");
Solution sol;
sol.read(buf, 4); // After calling your read method, buf should contain "abc". We read a total of 3 characters from the file, so return 3.
sol.read(buf, 1); // We have reached the end of file, no more characters can be read. So return 0.
Note:
- Consider that you cannot manipulate the file directly, the file is only accesible for
read4
but not forread
. - The
read
function may be called multiple times. - Please remember to RESET your class variables declared in Solution, as static/class variables are persisted across multiple test cases. Please see here for more details.
- You may assume the destination buffer array,
buf
, is guaranteed to have enough space for storing n characters. - It is guaranteed that in a given test case the same buffer
buf
is called byread
.
这道题是之前那道 Read N Characters Given Read4 的拓展,那道题说 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,参见代码如下:
解法一:
// Forward declaration of the read4 API.
int read4(char *buf); class Solution {
public:
int read(char *buf, int n) {
for (int i = ; i < n; ++i) {
if (readPos == writePos) {
writePos = read4(buff);
readPos = ;
if (writePos == ) return i;
}
buf[i] = buff[readPos++];
}
return n;
}
private:
int readPos = , writePos = ;
char buff[];
};
下面这种方法和上面的方法基本相同,稍稍改变了些解法,使得看起来更加简洁一些:
解法二:
// Forward declaration of the read4 API.
int read4(char *buf); class Solution {
public:
int read(char *buf, int n) {
int i = ;
while (i < n && (readPos < writePos || (readPos = ) < (writePos = read4(buff))))
buf[i++] = buff[readPos++];
return i;
}
char buff[];
int readPos = , writePos = ;
};
Github 同步地址:
https://github.com/grandyang/leetcode/issues/158
类似题目:
参考资料:
https://leetcode.com/problems/read-n-characters-given-read4-ii-call-multiple-times/
LeetCode All in One 题目讲解汇总(持续更新中...)
[LeetCode] Read N Characters Given Read4 II - Call multiple times 用Read4来读取N个字符之二 - 多次调用的更多相关文章
- [leetcode]158. Read N Characters Given Read4 II - Call multiple times 用Read4读取N个字符2 - 调用多次
The API: int read4(char *buf) reads 4 characters at a time from a file. The return value is the actu ...
- [Locked] Read N Characters Given Read4 & Read N Characters Given Read4 II - Call multiple times
Read N Characters Given Read4 The API: int read4(char *buf) reads 4 characters at a time from a file ...
- LeetCode Read N Characters Given Read4 II - Call multiple times
原题链接在这里:https://leetcode.com/problems/read-n-characters-given-read4-ii-call-multiple-times/ 题目: The ...
- ✡ leetcode 158. Read N Characters Given Read4 II - Call multiple times 对一个文件多次调用read(157题的延伸题) --------- java
The API: int read4(char *buf) reads 4 characters at a time from a file. The return value is the actu ...
- 158. Read N Characters Given Read4 II - Call multiple times
题目: The API: int read4(char *buf) reads 4 characters at a time from a file. The return value is the ...
- Read N Characters Given Read4 II - Call multiple times
The API: int read4(char *buf) reads 4 characters at a time from a file. The return value is the actu ...
- 【LeetCode】158. Read N Characters Given Read4 II - Call multiple times
Difficulty: Hard More:[目录]LeetCode Java实现 Description Similar to Question [Read N Characters Given ...
- leetcode[158] Read N Characters Given Read4 II - Call multiple times
想了好一会才看懂题目意思,应该是: 这里指的可以调用更多次,是指对一个文件多次操作,也就是对于一个case进行多次的readn操作.上一题是只进行一次reandn,所以每次返回的是文件的长度或者是n, ...
- [LeetCode] Read N Characters Given Read4 I & II
Read N Characters Given Read4 The API: int read4(char *buf) reads 4 characters at a time from a file ...
随机推荐
- 【分布式】Zookeeper使用--开源客户端
一.前言 上一篇博客已经介绍了如何使用Zookeeper提供的原生态Java API进行操作,本篇博文主要讲解如何通过开源客户端来进行操作. 二.ZkClient ZkClient是在Zookeepe ...
- 在idea中maven项目jdk编译version总是跳到1.5
bug描述 项目ide: idea 项目构建工具:maven bug现象:每次修改pom之后,idea自动扫描一遍,然后发现默认的compile级别跳到5.0. 每次手动去setting里修改comp ...
- iOS 触摸事件与UIResponder(内容根据iOS编程编写)
触摸事件 因为 UIView 是 UIResponder 的子类,所以覆盖以下四个方法就可以处理四种不同的触摸事件: 1. 一根手指或多根手指触摸屏幕 - (void)touchesBegan:(N ...
- .NET 版本区别,以及与 Windows 的关系
老是记不住各 Windows 版本中的 .NET 版本号,下面汇总一下: .NET Framework各版本汇总以及之间的关系 Mailbag: What version of the .NET Fr ...
- xUnit入门一
看了下Nhibernate的入门Demo,感觉测试驱动开发会更效率.当然,你可能觉得不是还要额外编程单元测试代码吗?开发怎么会更效率? 一句话解释之,磨刀不误砍柴工. 那就开始入门吧 ~.~ 笔者使用 ...
- C#开发微信门户及应用(4)--关注用户列表及详细信息管理
在上个月的对C#开发微信门户及应用做了介绍,写过了几篇的随笔进行分享,由于时间关系,间隔了一段时间没有继续写这个系列的博客了,并不是对这个方面停止了研究,而是继续深入探索这方面的技术,为了更好的应用起 ...
- ASP.NET从MVC5升级到MVC6 RC2 总目录 - 发布在RC2Release之后
序言 随着MVC6RC2的推出,MVC6的脚步越来越近了.但是在我们的手里,有大批量的MVC5的项目.如何将MVC5升级到MVC6,将是一个很大的课题.微软官方暂时没有一个升级指导,或者一个迁移工具, ...
- bzoj1036--树链剖分
模板题... #include<iostream> #include<cstdio> #include<cstring> using namespace std; ...
- 运用css,对于下拉菜单的制作
<html xmlns="http://www.w3.org/1999/xhtml" lang="en"> <head> <met ...
- js的命名规范
js的命名规范 1.驼峰命名法:首字母是小写的,接下来的字母都以大写字符开头.例如: var testValue = 0; var oneValue = 10; 2. ...