C++实现LeetCode(158.用Read4来读取N个字符之二|C++实现LeetCode(158.用Read4来读取N个字符之二 - 多次调用)
[LeetCode] 158. 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[] bufBelow is a high level example of how read4 works:
Returns:int
Note: buf[] is destination not source, the results from read4 will be copied to buf[]
File file("abcdefghijk"); // File is "abcdefghijk", initially file pointer (fp) points to 'a'Method read:
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
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 nExample 1:
Returns: int
Note: buf[] is destination not source, you will need to write the results to buf[]
File file("abc");【C++实现LeetCode(158.用Read4来读取N个字符之二|C++实现LeetCode(158.用Read4来读取N个字符之二 - 多次调用)】Example 2:
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.
File file("abc");Note:
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.
- Consider that you cannot manipulate the file directly, the file is only accesible for read4 but not for read.
- 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 by 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
解法一:
// Forward declaration of the read4 API.int read4(char *buf); 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]; };
下面这种方法和上面的方法基本相同,稍稍改变了些解法,使得看起来更加简洁一些:
解法二:
// Forward declaration of the read4 API.int read4(char *buf); 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; };
Github 同步地址:
https://github.com/grandyang/leetcode/issues/158
类似题目:
Read N Characters Given Read4
参考资料:
https://leetcode.com/problems/read-n-characters-given-read4-ii-call-multiple-times/
https://leetcode.com/problems/read-n-characters-given-read4-ii-call-multiple-times/discuss/49598/A-simple-Java-code
https://leetcode.com/problems/read-n-characters-given-read4-ii-call-multiple-times/discuss/49607/The-missing-clarification-you-wish-the-question-provided
到此这篇关于C++实现LeetCode(158.用Read4来读取N个字符之二 - 多次调用)的文章就介绍到这了,更多相关C++实现用Read4来读取N个字符之二 - 多次调用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- MybatisPlus使用queryWrapper如何实现复杂查询
- python学习之|python学习之 实现QQ自动发送消息
- 孩子不是实现父母欲望的工具——林哈夫
- opencv|opencv C++模板匹配的简单实现
- Node.js中readline模块实现终端输入
- 【Leetcode/Python】001-Two|【Leetcode/Python】001-Two Sum
- java中如何实现重建二叉树
- leetcode|leetcode 92. 反转链表 II
- 人脸识别|【人脸识别系列】| 实现自动化妆