Given a file and assume that you can only read the file using a given method read4
, implement a method to read n characters.
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[] buf4 = 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:
Input: file = "abc", n = 4 Output: 3 Explanation: After calling your read method, buf should contain "abc". We read a total of 3 characters from the file, so return 3.
Note that "abc" is the file's content, not buf. buf is the destination buffer that you will have to write the results to.Example 2:
Input: file = "abcde", n = 5 Output: 5 Explanation: After calling your read method, buf should contain "abcde". We read a total of 5 characters from the file, so return 5.Example 3:
Input: file = "abcdABCD1234", n = 12 Output: 12 Explanation: After calling your read method, buf should contain "abcdABCD1234". We read a total of 12 characters from the file, so return 12.Example 4:
Input: file = "leetcode", n = 5 Output: 5 Explanation: After calling your read method, buf should contain "leetc". We read a total of 5 characters from the file, so return 5.
Note:
- Consider that you cannot manipulate the file directly, the file is only accesible for
read4
but not forread
. - The
read
function will only be called once for each test case. - You may assume the destination buffer array,
buf
, is guaranteed to have enough space for storing n characters.
用 Read4 读取 N 个字符。
题目定义了一个read4()函数。同时题目给了一个buffer,用来存储字符,一个变量N表示要处理的字符串的总长度。请你利用read4()函数,将字符串存到buffer中。
这个题思路不难,但是我想很可能是题目表述不是很直观所以大部分人给的是downvote。
这个题的思路是,因为read4()函数每次只能读取4个字符,所以首先创建一个长度为4的临时数组,这样每次跑read4()函数的时候,可以把结果先存下来。然后按位一个个字符存入buffer中。因为read4()函数每次也是可以返回读到的字符串的长度的,所以当某一次read4()函数返回一个小于4的结果,就知道这个字符串快到末尾了,此时记得要break即可。
时间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 public int read(char[] buf, int n) { 13 char[] temp = new char[4]; 14 int i = 0; 15 int pointer = 0; 16 while (i < n) { 17 int len = read4(temp); 18 pointer = 0; 19 while (i < n && pointer < len) { 20 buf[i] = temp[pointer]; 21 i++; 22 pointer++; 23 } 24 if (len < 4) { 25 break; 26 } 27 } 28 return i; 29 } 30 }