To read n
characters, we first call read4
for n / 4
times. For example, if we want to read 10
characters, we will read them in the 8 (4 * 2) + 2
manner by first calling read4
for 2 (n / 4)
times to read the 8
characters.
Then we see if there is any remaining number of characters to read (in this case, remain = 2
).
If remain > 0
, we read them again using read4
. However, we may not be able to read all of them. For example, buf
has 9
characters and we need to read 10
. After reading the 8
characters we can only read the remaining 1
character. In this case, we simply add the minimum of remain
and the actual number of characters read by read4
to the couter (total) and return it.
Otherwise, we are done and just return n
.
The code is as follows.
1 // Forward declaration of the read4 API. 2 int read4(char *buf); 3 4 class Solution { 5 public: 6 /** 7 * @param buf Destination buffer 8 * @param n Maximum number of characters to read 9 * @return The number of characters read 10 */ 11 int read(char *buf, int n) { 12 int total = 0; 13 for (int i = 0; i < n / 4; i++) { 14 int read = read4(buf + total); 15 total += read; 16 } 17 int remain = n - total; 18 if (remain) { 19 int read = read4(buf + total); 20 return total + min(read, remain); 21 } 22 return n; 23 } 24 };