157. Read N Characters Given Read4
leetcode easy
Task
Предположим, что у вас есть файл, и вы можете читать файл только с помощью данного метода read4. Реализуйте метод для чтения n символов.
Метод read4:
API read4 читает четыре последовательных символа из файла, затем записывает эти символы в массив буфера buf4.
Возвращаемое значение — количество фактически прочитанных символов.
Обратите внимание, что у read4 есть собственный указатель файла, аналогично FILE *fp в C.
Определение read4:
Параметр: char[] buf4
Возвращает: int
buf4[] — это назначение, а не источник. Результаты из read4 будут скопированы в buf4[].
Метод read:
Используя метод read4, реализуйте метод read, который читает n символов из файла и сохраняет их в массиве буфера buf. Учтите, что вы не можете напрямую манипулировать файлом.
Возвращаемое значение — количество фактически прочитанных символов.
Определение read:
Параметры: char[] buf, int n
Возвращает: int
buf[] — это назначение, а не источник. Вам нужно будет записать результаты в buf[].
Примечание:
Учтите, что вы не можете напрямую манипулировать файлом. Файл доступен только для чтения с помощью read4, но не для read.
Функция read будет вызываться только один раз для каждого тестового случая.
Вы можете предполагать, что массив буфера назначения, buf, гарантированно имеет достаточно места для хранения n символов.
Пример:
Input: file = "abc", n = 4
Output: 3
Explanation: After calling your read method, buf should contain "abc". We read a total of 3 characters from the file, so return 3.
Note that "abc" is the file's content, not buf. buf is the destination buffer that you will have to write the results to.
C# solution
matched/originalpublic class Solution : Reader4 {
public int Read(char[] buf, int n) {
int copiedChars = 0, readChars = 4;
char[] buf4 = new char[4];
while (copiedChars < n && readChars == 4) {
readChars = Read4(buf4);
for (int i = 0; i < readChars; i++) {
if (copiedChars == n)
return copiedChars;
buf[copiedChars] = buf4[i];
copiedChars++;
}
}
return copiedChars;
}
}C++ solution
auto-draft, review before submit#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
public class Solution : Reader4 {
public int Read(char[] buf, int n) {
int copiedChars = 0, readChars = 4;
char[] buf4 = new char[4];
while (copiedChars < n && readChars == 4) {
readChars = Read4(buf4);
for (int i = 0; i < readChars; i++) {
if (copiedChars == n)
return copiedChars;
buf[copiedChars] = buf4[i];
copiedChars++;
}
}
return copiedChars;
}
}Java solution
matched/originalpublic class Solution extends Reader4 {
public int read(char[] buf, int n) {
int copiedChars = 0, readChars = 4;
char[] buf4 = new char[4];
while (copiedChars < n && readChars == 4) {
readChars = read4(buf4);
for (int i = 0; i < readChars; ++i) {
if (copiedChars == n) return copiedChars;
buf[copiedChars] = buf4[i];
++copiedChars;
}
}
return copiedChars;
}
}JavaScript solution
matched/originalclass Reader4 {
read4(buf4) {
return 0;
}
}
class Solution extends Reader4 {
read(buf, n) {
let copiedChars = 0, readChars = 4;
let buf4 = new Array(4).fill('\0');
while (copiedChars < n && readChars === 4) {
readChars = this.read4(buf4);
for (let i = 0; i < readChars; ++i) {
if (copiedChars === n) return copiedChars;
buf[copiedChars] = buf4[i];
++copiedChars;
}
}
return copiedChars;
}
}Python solution
matched/originalclass Solution:
def read(self, buf: List[str], n: int) -> int:
copied_chars = 0
read_chars = 4
buf4 = [""] * 4
while copied_chars < n and read_chars == 4:
read_chars = read4(buf4)
for i in range(read_chars):
if copied_chars == n:
return copied_chars
buf[copied_chars] = buf4[i]
copied_chars += 1
return copied_charsGo solution
matched/originalpackage main
import "fmt"
type Reader4 interface {
Read4(buf []byte) int
}
type Solution struct {
Reader4
}
func (sol *Solution) Read(buf []byte, n int) int {
copiedChars := 0
readChars := 4
buf4 := make([]byte, 4)
for copiedChars < n && readChars == 4 {
readChars = sol.Read4(buf4)
for i := 0; i < readChars; i++ {
if copiedChars == n {
return copiedChars
}
buf[copiedChars] = buf4[i]
copiedChars++
}
}
return copiedChars
}
func (sol *Solution) Read4(buf []byte) int {
return 0
}
func main() {
sol := &Solution{}
buffer := make([]byte, 100)
n := 10
bytesRead := sol.Read(buffer, n)
fmt.Println("Bytes read:", bytesRead)
fmt.Println("Content read:", string(buffer[:bytesRead]))
}Explanation
Algorithm
1️⃣
Инициализация и подготовка:
Инициализируйте переменные: copiedChars = 0 для подсчета скопированных символов и readChars = 4 для подсчета прочитанных символов из файла. Начальное значение readChars установлено в 4, что позволяет использовать условие readChars != 4 в качестве маркера конца файла (EOF).
Создайте внутренний буфер из 4 символов: buf4.
2️⃣
Чтение и копирование символов:
Пока количество скопированных символов меньше N (copiedChars < n) и еще есть символы в файле (readChars == 4):
Прочитайте символы из файла во внутренний буфер buf4 с помощью метода read4(buf4).
Копируйте символы из внутреннего буфера buf4 в основной буфер buf по одному. Увеличивайте copiedChars после каждого скопированного символа.
3️⃣
Завершение процесса:
Если количество скопированных символов достигло N (copiedChars == n), прервите процесс копирования.
Верните copiedChars как результат функции, указывающий на количество успешно скопированных символов в основной буфер buf.
😎