15. 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.

解法1:

这题其实针对的是在I中的解法里的一个问题,就是多读的buf会被扔掉。
这里因为要call multiple times,那么不能扔掉多读的,而是要存起来。
存起来的办法就是建一个queue,先读queue里的数,如果有多的就放回到queue里。
C++

1

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/* 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> queue = new LinkedList<>();
public int read(char[] buf, int n) {
int i = 0;
while (i < n && !queue.isEmpty()) {
buf[i++] = queue.poll();
}
// i points to the next inserting position
while (i < n) {
char[] buffer = new char[4];
int len = read4(buffer);
if (len == 0) {
return i;
}
int j = 0;
for (; j < len && i < n; j++) {
buf[i++] = buffer[j];
}
while (j < len) {
queue.offer(buffer[j++]);
}
}
return i;
}
}