Given a file and assume that you can only read the file using a given method read4
, implement a method read
to read n characters. Your method read
may be called multiple times.
Method read4:
The API read4
reads 4 consecutive characters from the file, then writes those characters into the buffer array buf
.
The return value is the number of actual characters read.
Note that read4()
has its own file pointer, much like FILE *fp
in C.
Definition of read4:
Parameter: char[] buf4 Returns: int Note: buf4[] is destination not source, the results from read4 will be copied to buf4[]
Below is a high level example of how read4
works:
File file("abcde"); // File is "abcde", initially file pointer (fp) points to 'a'
char[] buf = new char[4]; // Create buffer with enough space to store characters
read4(buf4); // read4 returns 4. Now buf = "abcd", fp points to 'e'
read4(buf4); // read4 returns 1. Now buf = "e", fp points to end of file
read4(buf4); // read4 returns 0. Now buf = "", fp points to end of file
Method read:
By using the read4
method, implement the method read
that reads n characters from the file and store it in the buffer array buf
. Consider that you cannot manipulate the file directly.
The return value is the number of actual characters read.
Definition of read:
Parameters: char[] buf, int n Returns: int Note: buf[] is destination not source, you will need to write the results to buf[]
Example 1:
File file("abc"); Solution sol; // Assume buf is allocated and guaranteed to have enough space for storing all characters from the file. sol.read(buf, 1); // After calling your read method, buf should contain "a". We read a total of 1 character from the file, so return 1. sol.read(buf, 2); // Now buf should contain "bc". We read a total of 2 characters from the file, so return 2. sol.read(buf, 1); // We have reached the end of file, no more characters can be read. So return 0.
Example 2:
File file("abc"); Solution sol; sol.read(buf, 4); // After calling your read method, buf should contain "abc". We read a total of 3 characters from the file, so return 3. sol.read(buf, 1); // We have reached the end of file, no more characters can be read. So return 0.
Note:
- Consider that you cannot manipulate the file directly, the file is only accesible for
read4
but not forread
. - The
read
function may be called multiple times. - Please remember to RESET your class variables declared in Solution, as static/class variables are persisted across multiple test cases. Please see here for more details.
- You may assume the destination buffer array,
buf
, is guaranteed to have enough space for storing n characters. - It is guaranteed that in a given test case the same buffer
buf
is called byread
.
用 Read4 读取 N 个字符 II。
这个题跟版本一的区别是版本一每次call这个API的时候,read函数只跑一次;但是这道题里面,read函数有可能跑多次。举个例子,文件是'abcdefg',多次read的时候,比如第一次n给1,那buf是‘a’,再read一次,n给2,那’a’已经读过了,所以现在buf是’bc’了, 如果再来个n=3的话,buf就是‘def’。总之就是一个test case 中read函数可以调用一次和调用多次的区别。
既然是有可能会跑多次,那么就需要用全局变量记录一些pointer,否则buf的写入就会有错。其他部分跟版本一很接近。
时间O(n)
空间O(1) - 只用了一个长度固定的额外数组
Java实现
1 /** 2 * The read4 API is defined in the parent class Reader4. 3 * int read4(char[] buf4); 4 */ 5 6 public class Solution extends Reader4 { 7 /** 8 * @param buf Destination buffer 9 * @param n Number of characters to read 10 * @return The number of actual characters read 11 */ 12 private int pointer = 0; 13 private int len = 0; 14 private char[] temp = new char[4]; 15 16 public int read(char[] buf, int n) { 17 int index = 0; 18 while (index < n) { 19 if (pointer == 0) { 20 len = read4(temp); 21 } 22 if (len == 0) { 23 break; 24 } 25 while (index < n && pointer < len) { 26 buf[index] = temp[pointer]; 27 index++; 28 pointer++; 29 } 30 if (pointer >= len) { 31 pointer = 0; 32 } 33 } 34 return index; 35 } 36 }