原题链接在这里:https://leetcode.com/problems/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.
题解:
与Read N Characters Given Read4类似。
需要多次调用,用queue来保存前一次调用read4没用完的数据. read时先用queue中的数据添加到buf中,若是不够再call read4.
在读够n个char后若是read4Buff中还有可用数据,加到queue中.
Time Complexity: O(n). Space: O(1). queue的大小不会超过4.
AC Java:
1 /* The read4 API is defined in the parent class Reader4. 2 int read4(char[] buf); */ 3 4 public class Solution extends Reader4 { 5 /** 6 * @param buf Destination buffer 7 * @param n Maximum number of characters to read 8 * @return The number of characters read 9 */ 10 11 private LinkedList<Character> que = new LinkedList<Character>(); 12 private boolean EOF = false; 13 public int read(char[] buf, int n) { 14 int readCount = 0; 15 16 //先用queue中剩余的上次结果加到buf中 17 while(!que.isEmpty() && readCount < n){ 18 buf[readCount++] = que.poll(); 19 } 20 //若是不够再调用read4 API 21 while(!EOF && readCount < n){ 22 char [] read4Buff = new char[4]; 23 int read4Num = read4(read4Buff); 24 if(read4Num < 4){ 25 EOF = true; 26 } 27 int countToRead = Math.min(n-readCount, read4Num); 28 for(int i = 0; i<countToRead; i++){ 29 buf[readCount++] = read4Buff[i]; 30 } 31 32 while(countToRead < read4Num){ //把当前read4Buff中没有读的有用char加到queue中 33 que.add(read4Buff[countToRead++]); 34 } 35 } 36 return readCount; 37 } 38 }