LeetCode 157,158. Read N Characters Given Read4 I+II
Read N Characters Given Read4
这个题目和C里面读文件很像。
read4每次只能读四个字符,把字符放到buf里,返回值是实际读到的字符数。
而我们要做的是用read4实现一个能够读n个字符的函数 read,同样,读到的字符放到buf里。
if (count==0) break; 是处理文件长度比n小的情况。
// Forward declaration of the read4 API. int read4(char *buf); class Solution { public: /** * @param buf Destination buffer * @param n Maximum number of characters to read * @return The number of characters read */ int read(char *buf, int n) { char* tmp=new char[4]; int len=0; while (len<n){ int count=read4(tmp); if (count==0) break; int i=0; while (len<n && i<count) buf[len++] = tmp[i++]; } return len; } };
当然,由于C++指针的缘故,也可以直接read4放到 buf+index 的位置。
Read N Characters Given Read4 II - Call multiple times
上一题的followup,其中与上一题有很大的区别。
由于需要多次read,下一次read是紧接在之前读完的字符之后的。这里有一个问题,如果之前read4的字符读多了怎么办?
因此,我们需要一个cache,暂存read4的内容。如果有剩下的,下一次读的时候先把剩下的读了,如果还不够再call read4。
// Forward declaration of the read4 API. int read4(char *buf); class Solution { public: /** * @param buf Destination buffer * @param n Maximum number of characters to read * @return The number of characters read */ char *cache=new char[4]; int index=0; // points to the first remaining char int count=0; // valid number of characters in cache int read(char *buf, int n) { int len=0; while (len<n){ while (len<n && index<count){ buf[len++] = cache[index++]; } if (len==n) break; count=read4(cache); if (count==0) break; index = 0; } return len; } };
References: