Welcome to Subscribe On Youtube
Question
Formatted question description: https://leetcode.ca/all/157.html
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 four consecutive characters from file
, then writes those characters into the buffer array buf4
.
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 buf4[] is a destination, not a 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 buf4 = "abcd", fp points to 'e' read4(buf4); // read4 returns 1. Now buf4 = "e", fp points to end of file read4(buf4); // read4 returns 0. Now buf4 = "", fp points to end of file
Algorithm
Read every 4, and then judge the results,
- If it is 0, it means that the buf has been read at this time, and the loop is jumped out, and the smaller value of res and n is directly returned.
- Otherwise, keep reading until n characters are read, the loop ends, and finally the smaller value of res and n is returned
Code
-
public class Read_N_Characters_Given_Read4 { 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) { boolean isEof = false; int charsRead = 0; char[] buf4 = new char[4]; while (!isEof && charsRead < n) { int size = read4(buf4); if (size < 4) { isEof = true; } if (charsRead + size > n) { size = n - charsRead; } /* arraycopy(Object src, int srcPos, Object dest, int destPos, int length); */ // if last iteration and size==0, then copy length==0, not over-copy System.arraycopy(buf4, 0, buf, charsRead, size); charsRead += size; } return charsRead; } } private class Reader4 { public int read4(char[] buf4) { return 1; // stub } } } ############ /** * The read4 API is defined in the parent class Reader4. * int read4(char[] buf4); */ public class Solution extends Reader4 { /** * @param buf Destination buffer * @param n Number of characters to read * @return The number of actual characters read */ public int read(char[] buf, int n) { char[] buf4 = new char[4]; int i = 0, v = 5; while (v >= 4) { v = read4(buf4); for (int j = 0; j < v; ++j) { buf[i++] = buf4[j]; if (i >= n) { return n; } } } return i; } }
-
// OJ: https://leetcode.com/problems/read-n-characters-given-read4/ // Time: O(N) // Space: O(1) // Forward declaration of the read4 API. int read4(char *buf); class Solution { public: /** * @param buf Destination buffer * @param n Number of characters to read * @return The number of actual characters read */ int read(char *buf, int n) { int cnt = 0; while (cnt < n) { int x = read4(buf + cnt); if (!x) break; cnt += x; } cnt = min(cnt, n); buf[cnt] = '\0'; return cnt; } };
-
""" The read4 API is already defined for you. @param buf4, a list of characters @return an integer def read4(buf4): # Below is an example of how the read4 API can be called. file = File("abcdefghijk") # File is "abcdefghijk", initially file pointer (fp) points to 'a' buf4 = [' '] * 4 # Create buffer with enough space to store characters read4(buf4) # read4 returns 4. Now buf = ['a','b','c','d'], fp points to 'e' read4(buf4) # read4 returns 4. Now buf = ['e','f','g','h'], fp points to 'i' read4(buf4) # read4 returns 3. Now buf = ['i','j','k',...], fp points to end of file """ class Solution: def read(self, buf, n): """ :type buf: Destination buffer (List[str]) :type n: Number of characters to read (int) :rtype: The number of actual characters read (int) """ i = 0 buf4 = [0] * 4 v = 5 while v >= 4: v = read4(buf4) for j in range(v): buf[i] = buf4[j] i += 1 if i >= n: return n return i ############ # The read4 API is already defined for you. # @param buf, a list of characters # @return an integer # def read4(buf): class Solution(object): def read(self, buf, n): """ :type buf: Destination buffer (List[str]) :type n: Maximum number of characters to read (int) :rtype: The number of characters read (int) """ cnt = 0 tmp = [""] * 4 while cnt < n: r = read4(tmp) if r == 0: break for i in range(min(r, n - cnt)): buf[cnt] = tmp[i] cnt += 1 return cnt
-
/** * The read4 API is already defined for you. * * read4 := func(buf4 []byte) int * * // Below is an example of how the read4 API can be called. * file := File("abcdefghijk") // File is "abcdefghijk", initially file pointer (fp) points to 'a' * buf4 := make([]byte, 4) // Create buffer with enough space to store characters * read4(buf4) // read4 returns 4. Now buf = ['a','b','c','d'], fp points to 'e' * read4(buf4) // read4 returns 4. Now buf = ['e','f','g','h'], fp points to 'i' * read4(buf4) // read4 returns 3. Now buf = ['i','j','k',...], fp points to end of file */ var solution = func(read4 func([]byte) int) func([]byte, int) int { // implement read below. return func(buf []byte, n int) int { buf4 := make([]byte, 4) i, v := 0, 5 for v >= 4 { v = read4(buf4) for j := 0; j < v; j++ { buf[i] = buf4[j] i++ if i >= n { return n } } } return i } }