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 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.
链接: http://leetcode.com/problems/read-n-characters-given-read4-ii-call-multiple-times/
题解:
又是比较难理解题意的一题...call multiple times,举个例子呀, 没例子咋理解。尝试了好几次才弄明白意思。给定read4,跟上一题一样,求可以call multiple times的read()。假如文件字符串是"abc",我们调用read(1),应该返回"a",再调用read(2),应该返回bc"。这里要注意的是,之前我们再第一次调用的时候,read4就已经读取了"abc",所以这道题其实就是要在上一题的基础上处理这种情况。解决方法不难,我们可以用一个queue来存储多读取的部分,然后在下次调用read的时候,根据情况判断,先读queue里面上次读剩下的数据,再进行下面的读取。也可以把read4的buffer放在global,然后用一个int型的offset来记录上次读了read4的多少。由于这个global buffer不会超过4,所以space complexity算是O(1)的。 LeetCode有些题真的很难读懂题意。
Time Complexity - O(n), Space Complexity - O(1)。
/* 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 Maximum number of characters to read
* @return The number of characters read
*/ private Queue<Character> q;
private boolean EOF; public Solution() {
this.q = new LinkedList<>();
this.EOF = false;
} public int read(char[] buf, int n) {
char[] read4Buffer = new char[4];
int bytesRead = 0; while (!q.isEmpty() && bytesRead < n) //try read queue buffer first
buf[bytesRead++] = q.poll(); while(!this.EOF && bytesRead < n) {
int read4Bytes = read4(read4Buffer);
if(read4Bytes < 4)
this.EOF = true;
int bytes = Math.min(n - bytesRead, read4Bytes);
System.arraycopy(read4Buffer, 0, buf, bytesRead, bytes);
bytesRead += bytes; if(bytes < 4) { //push read4 reminder to q for next read
for(int i = bytes; i < read4Bytes; i++)
this.q.offer(read4Buffer[i]);
}
} return bytesRead;
}
}
二刷:
这回题意理解得还算比较顺利。就是给一个read4()的api,每次最多读取4个char,要求实现read,读取n个char。这里n可以小于read4()返回的数字,也可以大于。
问题的关键是要储存多读的字符,我们使用一个queue就可以简单解决。每次调用read()的时候,先检查queue是否为空,假如不为空则先从queue中读取。接下来,假如仍然没有读到n个字符,我们就跟上一题一样,调用read4()来不断读取。 要注意多读的字符,我们要保存到queue中。最后返回一共读取的字符数就可以了。
也可以理解为把缓存中的东西持久化。
Java:
Time Complexity - O(n), Space Complexity - O(1)。
/* 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 Maximum number of characters to read
* @return The number of characters read
*/
Queue<Character> remainingChars = new LinkedList<>(); public int read(char[] buf, int n) {
char[] read4Buf = new char[4];
int read4Count = 0;
int totalCharsRead = 0;
while (remainingChars.size() > 0 && totalCharsRead < n) {
buf[totalCharsRead++] = remainingChars.poll();
}
//if (totalCharsRead == n) return n;
while ((read4Count = read4(read4Buf)) > 0) {
int i = 0;
while (i < read4Count && totalCharsRead < n) {
buf[totalCharsRead++] = read4Buf[i++];
}
while (i < read4Count) {
remainingChars.offer(read4Buf[i++]);
}
}
return totalCharsRead;
}
}
Reference:
https://leetcode.com/discuss/19581/clean-accepted-java-solution
https://leetcode.com/discuss/21219/a-simple-java-code
https://leetcode.com/discuss/21393/finally-get-question-understood-and-ac-by-c
https://leetcode.com/discuss/25200/my-python-40ms-solution
http://www.cnblogs.com/EdwardLiu/p/4240616.html
158. Read N Characters Given Read4 II - Call multiple times的更多相关文章
- 【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 对一个文件多次调用read(157题的延伸题) --------- java
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
想了好一会才看懂题目意思,应该是: 这里指的可以调用更多次,是指对一个文件多次操作,也就是对于一个case进行多次的readn操作.上一题是只进行一次reandn,所以每次返回的是文件的长度或者是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 用Read4来读取N个字符之二 - 多次调用
The API: int read4(char *buf) reads 4 characters at a time from a file. The return value is the actu ...
- LeetCode Read N Characters Given Read4 II - Call multiple times
原题链接在这里:https://leetcode.com/problems/read-n-characters-given-read4-ii-call-multiple-times/ 题目: 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-Read N Characters Given Read4 II
The API: int read4(char *buf) reads 4 characters at a time from a file. The return value is the actu ...
随机推荐
- LaTeX Pdf to Word
用LaTeX写的文稿,生成的pdf,如果要改成word文档,如何是最合适的方式? 查了很多帖子,比较靠谱的一种方式是先将pdf转成rtf格式,再用word打开rtf文件.也有直接从tex文件直接转成d ...
- TCP/IP 学习博客
原作者地址:http://blog.csdn.net/goodboy1881/article/category/204448
- TCP/IP协议三次握手与四次握手流程解析(转载及总结)
原文地址:http://www.2cto.com/net/201310/251896.html,转载请注明出处: TCP/IP协议三次握手与四次握手流程解析 一.TCP报文格式 TCP/IP协议的详 ...
- 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记2 Xcode、Auto Layout及MVC
原文链接不知道在哪, 接着上一话来讲,上一话中讲到了MVC,那么MVC在IOS8开发中是如何应用的呢?Paul Hegarty老师给我们展示了一个计算器的Demo,首先新建一个工程,老师把AppDel ...
- java多线程之停止线程
/*1.让各个对象或类相互灵活交流2.两个线程都冻结了,就不能唤醒了,因为根据代码要一个线程活着才能执行唤醒操作,就像玩木游戏3.中断状态就是冻结状态4.当主线程退出的时候,里面的两个线程都处于冻结状 ...
- 九度OJ 1349 数字在排序数组中出现的次数 -- 二分查找
题目地址:http://ac.jobdu.com/problem.php?pid=1349 题目描述: 统计一个数字在排序数组中出现的次数. 输入: 每个测试案例包括两行: 第一行有1个整数n,表示数 ...
- HTML5入门篇
---- HTML5简介 HTML5 是用于取代1999年所制定的 HTML 4.01 和 XHTML 1.0 标准的 HTML 标准版本,现在仍处于发展阶段,但大部分浏览器已经支持某些 HTML5 ...
- 在ctex环境下利用Metapost作图
使用Metapost作图,是LaTeX的好搭档.下面介绍如何在ctex环境下的使用Metapost作图. 首先新建一个test.mp的Metapost文件. 在文件开始需要声明如下代码: prolog ...
- jQuery Mobile里xxx怎么用呀? (事件篇)
jQuery Mobile里$(document).ready()怎么用呀? 相关链接: http://stackoverflow.com/questions/14468659/jquery-mobi ...
- java 子类的实例化和代码块初始化过程
1,子类的实例化 1,子父类中的构造函数的特点. 在子类构造对象时,发现,访问子类构造函数时,父类也运行了. 为什么呢? 原因是:在子类的构造函数中第一行有一个默认的隐式语句. super(); 子类 ...