Read N Characters Given Read4
Too many down votes. This is a waste of time. Spend very less time.
This problem can be solved by calling read4
in a loop, until we have read n
characters or we have reached the end of the file.
Here is the implementation in C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| // Forward declaration of the read4 API.
int read4(char *buf4);
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 total = 0;
while (total < n) {
char buf4[4];
int curr = min(read4(buf4), n - total);
for (int i = 0; i < curr; i++) {
buf[total++] = buf4[i];
}
// if we read less than 4 characters, we've reached the end of the file
if (curr < 4) break;
}
return total;
}
};
|
In this code:
- We call
read4
in a loop until we have read n
characters or we reach the end of the file. - We use
min(read4(buf4), n - total)
to ensure we do not read more than n
characters. - We use a for loop to add the characters read to the destination buffer
buf
. - If we read less than 4 characters from
read4
, it means we have reached the end of the file, so we break out of the loop. - Finally, we return the total number of characters read, which is
total
.
This solution ensures that we read exactly n
characters or the total characters in the file if n
is greater than the file length. The time complexity is O(n), as we read n
characters.
In Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| """
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: list, n: int) -> int:
total = 0
while total < n:
buf4 = [' '] * 4
current = min(read4(buf4), n - total)
for i in range(current):
buf[total] = buf4[i]
total += 1
if current < 4:
break
return total
|
The read4
function is defined as a stub because the actual implementation is provided by the system. The read
function works the same as the C++ code. It continuously calls read4
to read the characters into buf4
and then copies the characters to buf
until total
reaches n
or the file ends. Finally, it returns the total number of characters read.