leetcode157 - Read N Characters Given Read4 - easy
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.
模拟法。理清题意:
模拟内存从硬盘中读数据的方法,先从硬盘读一整块到缓冲区,之后内存根据需求直接从缓冲区要,可以要多可以要少。
备选被读物:硬盘(隐藏在api背后,通过read4隐式去接触)
Read4: 读硬盘一整块到内存区
Read: 内存实际需求
需要我们做的:实现一个缓冲区和相应功能。更具体的,
1.read4(char[] buf)就是你每调用一次,会根据隐藏文件里下4个字符是什么复制过来填充好buf数组,并且返回值是告知你有没有可能文件后续内容不够了我没有真的读到4个哦,我尽力了把剩下的都读出来给你了你看好还有多少个哦。
2.readn(char[] buf, int n)和上面的类似了,只是把4改成了n,n可能很大可能很小。但不管怎么样你把buf按我想要的填好,填多了不可以,如果因为文件不够填少了可以,但你要告诉我你填了多少。
我的实现:
/* 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 */ public int read(char[] buf, int n) { char[] buf4 = new char[4]; int offset = 0; while (offset < n) { int size = read4(buf4); if (size == 0) { break; } for (int i = 0; i < size && offset < n; i++) { buf[offset++] = buf4[i]; } } return offset; } }