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 ...
随机推荐
- string[] 和 arraylist互转及问题解决
1,String 数组转成 list<String> String[] s={"1","2","3","5" ...
- 【html】【10】div布局[div水平垂直居中]
必看参考: http://www.jb51.net/css/28259.html 让div居中对齐缩写形式为: .style{margin:0 auto;} 数字0 表示上下边距是0.可以按照需要设置 ...
- OC1_类与对象
// // main.m // OC1_类与对象 // // Created by zhangxueming on 15/6/9. // Copyright (c) 2015年 zhangxuemin ...
- ios - cordova 简介
Cordova 是一个可以让 JS 与原生代码(包括 Android 的 java,iOS 的 Objective-C 等)互相通信的一个库,并且提供了一系列的插件类,比如 JS 直接操作本地数据库的 ...
- Flex布局新旧混合写法详解(兼容微信)
原文链接:https://www.usblog.cc/blog/post/justzhl/Flex布局新旧混合写法详解(兼容微信) flex是个非常好用的属性,如果说有什么可以完全代替 float 和 ...
- Java多线程-线程的锁总结
一.多线程-同步函数的锁是this /*同步函数用的是哪一个锁呢?函数需要被对象调用.那么函数都有一个所属对象引用.就是this.所以同步函数使用的锁是this. 通过该程序进行验证. 使用两个线程来 ...
- hanoi双塔
汉诺塔,经典的递归. 经典的汉诺塔游戏相信很多同学都会玩的,规则就不用赘述,百科一下就OK.有三个柱子A,B,C,A柱子上套有n个大小不等的盘子,任意两个盘子,上面的盘子一定小于下面的盘子.现在请你编 ...
- vim 的 tags 模块 与 ctags
1. 概述 一般来说,在代码中跳转,离不开 ctags. 实际上,vim 中代码跳转是由 vim tags 模块完成的,tags 模块依赖于 tags 文件. ctags(Generate tag f ...
- MVC——分页控件
不管是什么类型的网站,分页都是必不可少的功能实现.在这里记录一下我自己接触过的分页控件: 一. MvcPager控件(记得项目里添加MvcPager.dll的引用) 这里面比较常用的就 ——@Html ...
- javascript调用外部wpf的方法
今天因为项目需要在wpf嵌入web页面,然后在web页面调用wpf的方法,于是突击学习了一下,记下备忘.^_^ 1.wpf中新建一个类WpfForScriptingHelper namespace w ...