157. Read N Characters Given Read4
Предположим, что у вас есть файл, и вы можете читать файл только с помощью данного метода 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# решение
сопоставлено/оригинал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;
}
}
C++ решение
auto-draft, проверить перед отправкой#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 решение
сопоставлено/оригиналpublic 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 решение
сопоставлено/оригиналclass 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 решение
сопоставлено/оригиналclass 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_chars
Go решение
сопоставлено/оригиналpackage 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]))
}
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.
😎
Вакансии для этой задачи
Показаны активные вакансии с пересечением по тегам задачи.