题目地址:
https://www.lintcode.com/problem/read-n-characters-given-read4-ii-call-multiple-times/description
给定一个接口int read4(char * buf)
可以每次从文件中读取
4
4
4个字符,返回值是实际读取的字符数(有可能文件剩下的字符数不够,从而返回小于
4
4
4的数字)。要求通过这个接口,实现从文件读取
n
n
n个字符的函数,返回值也是实际读取的字符数。这个函数会调用多次。
思路是利用队列。开个长度为
4
4
4的小数组,然后用两个指针分别指向队列头和队列尾(就是队列所含的最后一个元素的后一位的位置),接下来每次读
n
n
n个字符的时候,执行下面操作:
1、只要还没读够
n
n
n个字符,则进行循环;
2、如果队列空,那么调用read4
,将队列尾指针指向该函数返回值
x
x
x(表示读了
x
x
x个字符了,尾指针指向其后的位置);
3、如果
x
x
x是
0
0
0,说明已经没有字符可以读了,退出循环;
4、否则说明还有字符可以读,只要当没读够
n
n
n个字符并且队列里还有字符的时候,进行读取,并同时记录读了多少个字符。
最后返回读了多少个字符即可。代码如下:
public class Solution extends Reader4 {
private char[] buffer = new char[4];
private int head, tail;
/**
* @param buf destination buffer
* @param n maximum number of characters to read
* @return the number of characters read
*/
public int read(char[] buf, int n) {
// Write your code here
// res记录本次读取多少个字符
int res = 0;
// 只要没读够n个字符就循环
while (res < n) {
// 如果队列空,则进行读取,并重置头指针为0
if (head == tail) {
head = 0;
tail = read4(buffer);
}
// 如果没读到任何字符,则退出循环
if (tail == 0) {
break;
}
// 否则只要没读够n个字符,并且队列不空,就进行读取,并赋值给buf数组
while (res < n && head < tail) {
buf[res++] = buffer[head++];
}
}
return res;
}
}
class Reader4 {
int read4(char[] buf) {
return 0;
}
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)。